当我有以下代码并且我提交表单时,我的帖子操作将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();
}
答案 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();
}