C# 如何正确地将SelectListItem用于HTML.DropDownList而不是SelectList?

C# 如何正确地将SelectListItem用于HTML.DropDownList而不是SelectList?,c#,asp.net-mvc,razor,asp.net-mvc-5,ienumerable,C#,Asp.net Mvc,Razor,Asp.net Mvc 5,Ienumerable,我一直在翻阅其他帖子,试图找出如何从在控制器中使用SelectList来填充视图中的@Html.DropDownList改为使用通常建议的SelectListItem,但我完全迷路了 我有一个主要的库存资产模型,当我进入编辑视图时,我包括其他模型属性的下拉列表位置、制造商、模型、状态、类型、供应商等。我下面的当前代码充分填充了列表,并允许我在编辑时将所选实体值更改为存储在相关表中的任何其他值 当前代码: 控制器: 查看-仅[位置],例如: 我现在要做的是在每个列表中添加一个值,声明addnew,

我一直在翻阅其他帖子,试图找出如何从在控制器中使用SelectList来填充视图中的@Html.DropDownList改为使用通常建议的SelectListItem,但我完全迷路了

我有一个主要的库存资产模型,当我进入编辑视图时,我包括其他模型属性的下拉列表位置、制造商、模型、状态、类型、供应商等。我下面的当前代码充分填充了列表,并允许我在编辑时将所选实体值更改为存储在相关表中的任何其他值

当前代码:

控制器:

查看-仅[位置],例如:

我现在要做的是在每个列表中添加一个值,声明addnew,我想让用户点击它并获得部分视图?弹出窗口,以便他们立即添加新的相关记录,例如仓库2的新[Location],然后能够从正在编辑的特定资产的[Locations]列表中选择该记录

有人能带我走过这段路吗


很多建议是将SelectList或IEnumerable添加到我的相关模型属性中,但从那个里我就不知道在我的控制器/视图中调整什么了?目前,我正在项目的DAL文件夹中使用代码优先迁移和InventoryTrackerContext.cs。

您混淆了这两个非常不同的方面。首先,Html.DropDownList只需要一个IEnumerable。传递完整的SelectList对象仅因为SelectList是IEnumerable而满足此参数。不使用SelectList的建议只是为了省去构建完整SelectList对象的工作,并记住将selectedValue设置为正确的项,Razor将为您处理这些事情。使用SelectList还是IEnumerable与问题的其余部分无关


在向现有下拉列表添加项目时,必须使用JavaScript。基本上,只需在DOM中选择select元素并附加一个新的选项节点就可以了。

不可能通过控制器而不是JS/jQuery添加新选项吗?除非重新加载整个页面。由于用户通过弹出窗口添加新选项,因此您必须重新加载整个页面以从控制器刷新选项,或者使用JS动态插入新添加的选项。
// GET: INV_Assets/Edit/5
        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.Location_Id = new SelectList(db.INV_Locations, "Id", "location_dept", iNV_Assets.Location_Id);
            ViewBag.Manufacturer_Id = new SelectList(db.INV_Manufacturers, "Id", "manufacturer_description", iNV_Assets.Manufacturer_Id);
            ViewBag.Model_Id = new SelectList(db.INV_Models, "Id", "model_description", iNV_Assets.Model_Id);
            ViewBag.Status_Id = new SelectList(db.INV_Statuses, "Id", "status_description", iNV_Assets.Status_Id);
            ViewBag.Type_Id = new SelectList(db.INV_Types, "Id", "type_description", iNV_Assets.Type_Id);
            ViewBag.Vendor_Id = new SelectList(db.INV_Vendors, "Id", "vendor_name", iNV_Assets.Vendor_Id);
            return View(iNV_Assets);
        }

        // POST: INV_Assets/Edit/5
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [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)
            {
                db.Entry(iNV_Assets).State = EntityState.Modified;
                await db.SaveChangesAsync();
                return RedirectToAction("Index");
            }
            ViewBag.Location_Id = new SelectList(db.INV_Locations, "Id", "location_dept", iNV_Assets.Location_Id);
            ViewBag.Manufacturer_Id = new SelectList(db.INV_Manufacturers, "Id", "manufacturer_description", iNV_Assets.Manufacturer_Id);
            ViewBag.Model_Id = new SelectList(db.INV_Models, "Id", "model_description", iNV_Assets.Model_Id);
            ViewBag.Status_Id = new SelectList(db.INV_Statuses, "Id", "status_description", iNV_Assets.Status_Id);
            ViewBag.Type_Id = new SelectList(db.INV_Types, "Id", "type_description", iNV_Assets.Type_Id);
            ViewBag.Vendor_Id = new SelectList(db.INV_Vendors, "Id", "vendor_name", iNV_Assets.Vendor_Id);
            return View(iNV_Assets);
        }
<div class="form-group">
            @*@Html.LabelFor(model => model.Location_Id, "Location_Id", htmlAttributes: new { @class = "control-label col-md-2" })*@
            <span class="control-label col-md-2">Location:</span>
            <div class="col-md-10">
                @Html.DropDownList("Location_Id", null, htmlAttributes: new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.Location_Id, "", new { @class = "text-danger" })
            </div>
        </div>