Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 DropDownListFor&;导航属性_Asp.net Mvc 3_Navigation_Properties_Html.dropdownlistfor - Fatal编程技术网

Asp.net mvc 3 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

我在尝试使用@Html.DropDownListFor()时遇到问题

我有一个带有导航属性的模型:

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()
                               });
}