MVC下拉列表未映射到模型

时间:2011-02-18 15:34:31

标签: c# asp.net-mvc entity-framework

我正在尝试使用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可以映射回一个对象。

2 个答案:

答案 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...