gpt4 book ai didi

asp.net-mvc-3 - DropDownListFor 和导航属性

转载 作者:行者123 更新时间:2023-12-02 14:10:00 25 4
gpt4 key购买 nike

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

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

public class Thing {
...
public virtual Vendor Vendor { get; set; }
}

在 Controller 中,我抓取供应商列表并将其放入 ViewBag 中:

public ActionResult Create() {
ViewBag.Vendors = Vendor.GetVendors(SessionHelper.CurrentUser.Unit_Id);
return View();
}

View 中的 html 项目如下所示:

@Html.DropDownListFor(model => model.Vendor, new SelectList(ViewBag.Vendors, "Id", "Name"), "---- Select vendor ----")
@Html.ValidationMessageFor(model => model.Vendor)

下拉列表正在呈现,在我提交表单之前一切看起来都很好。 HttpPost Create 方法在 ModelState.IsValid 上返回 false 并引发模型错误:从类型“System.String”到类型“...Models.Vendor”的参数转换失败,因为没有类型转换器可以在这些类型之间进行转换类型。

如果我让页面通过,我最终会遇到服务器错误:异常详细信息:System.ArgumentNullException:值不能为 null。参数名称:items

经过一番搜索后,我无法找到 @Html.DropDownListFor() 未正确地将 Vendor 对象自动绑定(bind)到导航属性的原因。

任何帮助将不胜感激。

编辑:我最终必须显式设置foreignkey属性,以便可以直接访问“Vendor_Id”,然后我将DropDownListFor更改为指向“Vendor_Id”而不是导航属性。这似乎有效。

最佳答案

我发现最好的方法如下。更改 Controller 以创建 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();
}

然后修改 View 如下:

@Html.DropDownListFor(model => model.Vendor, (IEnumerable<SelectListItem>)ViewBag.Vendors,    "---- Select vendor ----")
@Html.ValidationMessageFor(model => model.Vendor)

您必须将 ViewBag.Vendors 强制转换为 (IEnumerable)。

这使 View 保持美观和整洁。您还可以将获取 SelectListItems 的代码移至您的存储库,并将其放入名为 GetVendorsList() 之类的方法中。

public IEnumerable<SelectListItem> GetVendorsList(int unitId){
return Vendor.GetVendors(unitId)
.Select(option => new SelectListItem
{
Text = (option == null ? "None" : option.Name),
Value = option.Id.ToString()
});
}

这可以很好地分离关注点并保持 Controller 整洁。

祝你好运

关于asp.net-mvc-3 - DropDownListFor 和导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7003910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com