我正在尝试使用EF codefirst在MVC 3中开发应用程序。当我使用int属性和约定来设置外键关系时,例如
public class Patient
{
public int ConsultantId {get;set;}
}
然后我设置了一个创建和编辑页面,并使用HTML.DropDownListFor Helper生成可能的顾问列表
@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...")
哪种方法很好,但我现在想要在患者类上使用Consultant对象,例如
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为InValid,显示此错误“无法转换
'System.String'键入'Web.Models.Consultant'。有没有人知道如何使用DropDownListFor,因此Model可以映射回一个对象。
答案 0 :(得分:2)
我找到了一个适合我的解决方案。使用权利框架codefirst,您可以在同一个类中同时拥有public int ConsultantId属性和public virtual Consultant属性。数据库中仍然只有一个由ConsultantId属性定义的关系。因此,如果这是一个可以为空的int,则该关系将是可选的。
答案 1 :(得分:1)
下拉列表选择值(ConsultantId)被绑定到模型上的Consultant属性,该属性的类型为Consultant。
您可以将下拉值绑定到Consultant.ConsultantId吗?
示例:
@Html.DropDownListFor(model => model.Consultant.ConsultantId, // the rest of the statement goes here...