2011-02-18 41 views
4

我試圖在使用EF codefirst的MVC 3中開發應用程序。當我使用int屬性和約定來設置外鍵關係時,例如MVC下拉列表未映射到型號

public class Patient 
{   
    public int ConsultantId {get;set;} 
} 

然後我設置的創建和編輯頁面,並使用HTML.DropDownListFor助手產生的可能的顧問

@Html.DropDownListFor(model => model.ConsultantId, ((IEnumerable<Web.Models.Consultant>)ViewBag.PossibleConsultants).Select(option 
    => new SelectListItem 
    { 
     Text = Html.DisplayTextFor(_ => option.ConsultantName).ToString(), 
     Value 
      = option.ConsultantId.ToString(), 
     Selected = (Model != null) && (option.ConsultantId 
      == Model.ConsultantId) 
    }), "Choose...") 

的正常工作清單,但我現在要移動到具有顧問對象在病人課上例如

public class Patient 
    { 
     public virtual Consultant Consultant {get;set;} 
    } 

    public class Consultant { 
     public virtual ICollection<Patient> Patient {get;set;} 
} 

我現在嘗試使用DropDownListfor設置視圖,但是這次在model.Consultant中,例如

@Html.DropDownListFor(model => model.Consultant, ((IEnumerable<Web.Models.Consultant>)ViewBag.PossibleConsultants).Select(option 
=> new SelectListItem 
{ 
    Text = Html.DisplayTextFor(_ => option.ConsultantName).ToString(), 
    Value 
     = option.ConsultantId.ToString(), 
    Selected = (Model != null) && (option.ConsultantId 
     == Model.Consultant.ConsultantId) 
}), "Choose...") 

的創建和編輯正確的頁面加載和顧問的編輯頁面上正確選擇,但是當我發佈頁面的ModelState是這個錯誤無效「無法轉換
‘System.String’到鍵入'Web.Models.Consultant「。有誰知道如何使用DropDownListFor,以便模型可以映射回對象。

回答

2

我發現我工作的解決方案。使用entitiy框架codefirst,您可以將public int ConsultantId屬性和公共虛擬Consultant屬性放在同一個類中。數據庫中仍然只有一個由ConsultantId屬性定義的關係。所以如果這是一個可空的int關係將是可選的。

+0

這真的是最好的方法嗎?有沒有人遇到過這樣做,而不必申報一個單獨的ID屬性? – 2012-12-28 09:39:29

1

下拉列表選擇值(ConsultantId)被綁定到模型上的Consultant屬性,該屬性的類型爲Consultant。

您可以將下拉值綁定到Consultant.ConsultantId上嗎?

例子:

@Html.DropDownListFor(model => model.Consultant.ConsultantId, // the rest of the statement goes here... 
+0

如果你這樣做,那麼只有一個Id的顧問對象的驗證錯誤被視爲無效。 – 2011-02-23 09:02:23