[asp.net-mvc]2 实体框架模型中的字段组合在 1 此时?

发布时间: 2017/3/25 18:17:44
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我试图显示 2 字段从我 INV_Locations 内此时模型︰ location_dept|location_room 或例如 IT|Storage 。使用帖子我拼凑下面一起通过 ViewData :

INV_AssetsController-Edit() 得到

    public async Task<ActionResult> Edit(int id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        INV_Assets iNV_Assets = await db.INV_Assets.FindAsync(id);
        if (iNV_Assets == null)
        {
            return HttpNotFound();
        }

        ViewBag.History = GetHistoryByAssetId(id);

        ViewData["Location_Id"] = new SelectList((from l in db.INV_Locations.ToList() select new { location_room = l.location_dept + "|" + l.location_room }), "location_room", null, null);
    }

INV_AssetsController-Edit() HttpPost:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Edit([Bind(Include = "Id,Model_Id,Manufacturer_Id,Type_Id,Location_Id,Vendor_Id,Status_Id,ip_address,mac_address,note,owner,cost,po_number,description,invoice_number,serial_number,asset_tag_number,acquired_date,disposed_date,created_date,created_by,modified_date,modified_by")] INV_Assets iNV_Assets)
    {
        if (ModelState.IsValid)
        {
            iNV_Assets.modified_date = DateTime.Now;
            iNV_Assets.modified_by = System.Environment.UserName;
            db.Entry(iNV_Assets).State = EntityState.Modified;
            await db.SaveChangesAsync();
            return RedirectToAction("Index", "Home");
        }
        ViewData["Location_List"] = new SelectList((from l in db.INV_Locations.ToList() select new { location_room = l.location_dept + "|" + l.location_room }), "location_room", null, null);
        return View(iNV_Assets);
    }

INV_Assets-Edit() 视图

        <span class="control-label col-md-2">Location:</span>
        <div class="col-md-4">
            @*@Html.DropDownList("Location_Id", null, htmlAttributes: new { @class = "form-control dropdown" })*@
            @Html.DropDownListFor(model => model.Location_Id, (SelectList)ViewData["Location_List"], htmlAttributes: new { @class = "form-control dropdown", @id = "selectLocation" })
            @Html.ValidationMessageFor(model => model.Location_Id, "", new { @class = "text-danger" })
        </div>

这是密切,渲染 (如) 在我下拉列表中以下︰

{ location_room = IT|Server }{ location_room = IT|Storage },等等。

有谁知道语法的变化要为了只在此时显示相关部件 ( IT|Server ) 吗?

解决方法 1:

您还没有指定 dataTextField 属性在 SelectList 构造函数,所以它默认为 ToString() 匿名对象的方法。它需要: (注意最后一个参数不是必需的)

ViewData["Location_List"] = new SelectList((from l in db.INV_Locations.ToList()
  select new { location_room = l.location_dept + "|" + l.location_room }),
  "location_room", "location_room");

便笺︰

  1. 你 GET 方法 ViewData["Location_Id"] (我假设这是一个错字,应该是 ViewData["Location_List"] (根据 POST 方法)
  2. 你没有证明你的模型,但 Location_Id 认为标识符属性 (通常 int ) 所以不知道如何你会期望这项工作。您要绑定的文本值"它 |服务器"或"它 |存储"的属性 Location_Id ,我怀疑有没有关系到你的模型或数据库字段。我怀疑你到底需要什么在这里级联下拉列表,其中一个部门来说,和第二个房间 (绑定到 Location_Id 这更新使用 ajax 时选择了部门。
  3. 我建议你重新因子生成 SelectList (和其他通用代码) 到一个私有的方法,以避免重复代码。
  4. 我强烈建议你学会使用视图模型和停止搅拌了模型 ViewBagViewData 和删除那可怕 [Bind(Include = "..")] 属性
官方微信
官方QQ群
31647020