Asp.net mvc 3 DropDownListFor&;导航属性
我在尝试使用@Html.DropDownListFor()时遇到问题 我有一个带有导航属性的模型:Asp.net mvc 3 DropDownListFor&;导航属性,asp.net-mvc-3,navigation,properties,html.dropdownlistfor,Asp.net Mvc 3,Navigation,Properties,Html.dropdownlistfor,我在尝试使用@Html.DropDownListFor()时遇到问题 我有一个带有导航属性的模型: public class Thing { ... public virtual Vendor Vendor { get; set; } } 在控制器中,我抓取供应商列表,将其放入ViewBag: public ActionResult Create() { ViewBag.Vendors = Vendor.GetVendors(SessionHelper.CurrentUser.Un
public class Thing {
...
public virtual Vendor Vendor { get; set; }
}
在控制器中,我抓取供应商列表,将其放入ViewBag:
public ActionResult Create() {
ViewBag.Vendors = Vendor.GetVendors(SessionHelper.CurrentUser.Unit_Id);
return View();
}
视图中的html项如下所示:
@Html.DropDownListFor(model => model.Vendor, new SelectList(ViewBag.Vendors, "Id", "Name"), "---- Select vendor ----")
@Html.ValidationMessageFor(model => model.Vendor)
下拉列表正在呈现,在我提交表单之前,一切似乎都很好。HttpPost创建方法在ModelState.IsValid上返回false并引发模型错误:从类型“System.String”到类型“…Models.Vendor”的参数转换失败,因为没有类型转换器可以在这些类型之间转换
如果我让页面通过,我最终会出现服务器错误:
异常详细信息:System.ArgumentNullException:值不能为null。
参数名称:items
在上下搜索之后,我找不到@Html.DropDownListFor()未能将供应商对象正确自动绑定到导航属性的原因
任何帮助都将不胜感激
编辑:
最后,我不得不显式设置ForeignKey属性,以便直接访问“Vendor\u Id”,然后我将DropDownListFor更改为指向“Vendor\u Id”,而不是导航属性。这似乎有效。我发现最好的方法如下。更改控制器以创建SelectListItems
public ActionResult Create() {
ViewBag.Vendors = Vendor.GetVendors(SessionHelper.CurrentUser.Unit_Id)
.Select(option => new SelectListItem
{
Text = (option == null ? "None" : option.Name),
Value = option.Id.ToString()
});
return View();
}
然后修改视图,如下所示:
@Html.DropDownListFor(model => model.Vendor, (IEnumerable<SelectListItem>)ViewBag.Vendors, "---- Select vendor ----")
@Html.ValidationMessageFor(model => model.Vendor)
@Html.DropDownListFor(model=>model.Vendor,(IEnumerable)ViewBag.Vendors,“----选择Vendor-->”)
@Html.ValidationMessageFor(model=>model.Vendor)
您必须将ViewBag.Vendors强制转换为(IEnumerable)
这样可以保持风景优美整洁。您还可以将获取SelectListItems的代码移动到repo中,并将其放入一个名为GetVendorsList()的方法中
public IEnumerable GetVendorList(int-unitId){
返回供应商。获取供应商(unitId)
.选择(选项=>new SelectListItem
{
Text=(option==null?“无”:option.Name),
Value=option.Id.ToString()
});
}
这将很好地分离关注点并保持控制器整洁
祝你好运我在下面的问题中回答了类似的问题。这个问题的答案也很好
此方法不会在controller中发布SelectList。我不认为在controller中发布SelectList是个好主意,因为这意味着我们要处理controller中的视图部分,这显然不是关注点的分离。您不应该使用ViewBag传递视图中的数据。你应该使用视图模型。我不能在这里发布代码,它不可读。PM我,我会让你知道;)同意。这是很久以前的事了。我想到了MVC3。视图模型无疑是一种发展方向。
public IEnumerable<SelectListItem> GetVendorsList(int unitId){
return Vendor.GetVendors(unitId)
.Select(option => new SelectListItem
{
Text = (option == null ? "None" : option.Name),
Value = option.Id.ToString()
});
}