我在ASP.NET MVC 5中工作(但这很可能也适用于以前的版本).提出这个问题的最佳方式是向您展示代码:
这是视图模型:
public class PersonCreateViewModel { public SelectList cities {get; set;} public String Name { get; set; } public String Address { get; set; } }
这是控制器的http Post方法:
[HttpPost] [ValidateAntiForgeryToken] public ActionResult Create(PersonCreateViewModel viewmodel) { if (ModelState.IsValid) { //Add to database here and return } //return back to view if invalid db save return View(person); }
这是视图:
@Html.LabelFor(model => model.person.name, new { @class = "control-label col-md-2" })@Html.EditorFor(model => model.person.name) @Html.ValidationMessageFor(model => model.person.name)@Html.LabelFor(model => model.person.address, new { @class = "control-label col-md-2" })@Html.EditorFor(model => model.person.address) @Html.ValidationMessageFor(model => model.person.address)@Html.LabelFor(model => model.person.CityID, "CityID", new { @class = "control-label col-md-2" })@Html.DropDownList("cities") @Html.ValidationMessageFor(model => model.person.CityID)
当用户单击"提交"时,浏览器中会显示以下错误消息:"没有为此对象定义无参数构造函数."
我认为这与我在ViewModel中有一个SelectList的事实有关.我认为当视图在表单提交时将模型传递回控制器时,它会调用SelectList的构造函数,但是没有SelectList的无参数构造函数.我不知道该怎么办.任何帮助表示赞赏!!
我总是使用IEnumerable获得更好的运气
public class PersonCreateViewModel { public IEnumerable<SelectListItem> cities {get; set;} public int CityId { get; set; } public String Name { get; set; } public String Address { get; set; } }
此外,您将需要视图模型上的属性来捕获选定的值,如CityId.
然后你可以使用:
Html.DropDownListFor(m => m.CityId, Model.cities)