使用DropDownListFor的模型SelectList不绑定在HttpPost上

时间:2014-04-08 05:13:13

标签: asp.net-mvc linq-to-entities asp.net-mvc-5

当我有以下代码并且我提交表单时,我的帖子操作将Contact对象显示为null。如果我从视图中删除DropDownListFor,则Contact对象包含预期信息(FirstName)。为什么?如何使SelectList值起作用?

我的课程:

public class ContactManager
{       
    public Contact Contact { get; set; }       
    public SelectList SalutationList { get; set; }
}
public class Contact
{
    public int Id{get;set;}
    public string FirstName{get; set;}
    public SalutationType SalutationType{get; set;}
}
 public class SalutationType
{      
    public int Id { get; set; }
    public string Name { get; set; }      
}

我的观点:

@model ViewModels.ContactManager

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)
    @Html.HiddenFor(model => model.Contact.Id)
    @Html.DropDownListFor(model => model.Contact.SalutationType.Id, Model.SalutationList, "----", new { @class = "form-control" })
    @Html.EditorFor(model => model.Contact.FirstName)
    <input type="submit" value="Save" />
}

我的控制器:

public ActionResult Edit(int? id)
{
    Contact contact = db.Contacts.FirstOrDefault(x => x.Id == id);
    ContactManager cm = new ContactManager();
    cm.Contact = contact;
    cm.SalutationList = new SelectList(db.SalutationTypes.Where(a => a.Active == true).ToList(), "Id", "Name");
    return View(cm);
}
[HttpPost]
public ActionResult Edit(ContactManger cm)
{
//cm at this point is null
    var test = cm.Contact.FirstName;
    return View();
}

2 个答案:

答案 0 :(得分:0)

您将使用ViewBag传递DropdownList:

ViewBag.SalutationList = new SelectList(db.SalutationTypes.Where(a => a.Active == true).ToList(), "Id", "Name");

比你必须在编辑视图中调用此列表:

 @Html.DropDownList("SalutationList",String.Empty)

答案 1 :(得分:0)

问题是如果使用不同的参数名,DefaultModelBinder将无法正确映射嵌套模型。您必须使用相同的参数名称作为型号名称。

public ActionResult Edit(ContactManager contactManager)

作为一般做法,始终使用模型的名称作为参数名称以避免映射问题。

进一步建议:

您可以使用Contact作为参数模型,如果您只需要联系模式,则无需使用ContactManager

[HttpPost]
public ActionResult Edit(Contact contact)
{
    var test = contact.FirstName;
    return View();
}