asp.net mvc 5下拉列表在添加后不显示列表中的项目

时间:2016-04-28 01:16:12

标签: c# asp.net asp.net-mvc asp.net-mvc-5 cascadingdropdown

我想做什么...... 我试图让一个新添加的项目显示在级联下拉列表中。

...概述 第一个下拉列表(我称之为ddlCategory)用于选择电气设备类别(即电器,视听,照明等)。第二个下拉列表(我将调用ddlElecDev)填充由所选类别过滤的设备。如果设备未在ddlElecDev中列出,则用户可以单击链接以添加新链接。保存新添加的电气设备后,用户将电气设备ID作为参数重定向回原始页面。

以上所有情况似乎都很好。但是,当用户被重定向到第一页时,不仅没有在ddlElecDev中选择新添加的电子设备,而且它甚至不会出现在列表中。奇怪的是,如果我刷新页面,则会自动选择

有人可以向我解释如何在不刷新页面的情况下选择新添加的设备吗?

这是选择类别和电子设备的标记:

<div class="form-group">
            @Html.LabelFor(model => model.SelectedCategory, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownListFor(model => model.SelectedCategory, Model.Categories, "Select a Category", new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.SelectedCategory, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.ElectricalDeviceID, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.CascadingDropDownListFor(
                expression: model => model.ElectricalDeviceID,
                triggeredByProperty: model => model.SelectedCategory,
                url: Url.Action("GetElectricalDevices", "ElectricalDeviceConfigurations"),
                ajaxActionParamName: "categoryId",
                optionLabel: "Select an Electrical Device",
                disabledWhenParrentNotSelected: false,
                htmlAttributes: new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.ElectricalDeviceID, "", new { @class = "text-danger" })
                @Html.ActionLink("Not Listed? Add a new Electrical Device", "AddNew", "ElectricalDevices", new { returnUrl = string.Format("/ElectricalDeviceConfigurations/AddConfiguration?eventVendorId={0}", Model.EventVendorID) }, null)
            </div>
        </div>

可以在以下位置找到Cascading DropDownList Helper的文档 https://github.com/alexanderar/Mvc.CascadeDropDown

这是用于选择电气设备的Controller方法:

public ActionResult AddConfiguration(int? eventVendorId, int? newElecDev)
        {
(Some code removed for brevity)
            var selectedCategoryId = db.ElectricalDeviceCategoryLookups.Where(cat => cat.Category == Enums.ElectricalDeviceCategory.All).FirstOrDefault().ID;
            var electricalDeviceID = (newElecDev.HasValue) ? newElecDev : null;
            return View(new ElecDevConfigSelectionViewModel { EventVendorID = eventVendorId, EventVendor = eventVendor, Categories = GetCategories(), SelectedCategory = selectedCategoryId, ElectricalDeviceID = electricalDeviceID });
        }

这里是用于填充类别和电气设备的控制器方法:

private List<SelectListItem> GetCategories()
        {
            var categories = new List<SelectListItem>();
            db.ElectricalDeviceCategoryLookups.OrderBy(c => c.Description).ToList().ForEach(item => categories.Add(new SelectListItem { Text = item.Description, Value = item.ID.ToString() } ));
            return categories;
        }

        public ActionResult GetElectricalDevices(int? categoryId)
        {
            if (categoryId.HasValue)
            {
                var selCategory = db.ElectricalDeviceCategoryLookups.Where(cat => cat.ID == categoryId).FirstOrDefault().Category;
                var elecDevicesSelectList = new List<SelectListItem>();
                var elecDevices = (selCategory == Enums.ElectricalDeviceCategory.All) ? db.ElectricalDevices.OrderBy(ed => ed.Name).ToList() : db.ElectricalDevices.Where(ed => ed.Category == selCategory).OrderBy(ed => ed.Name).ToList();
                elecDevices.ForEach(ed => elecDevicesSelectList.Add(new SelectListItem { Text = ed.Name, Value = ed.ID.ToString() }));
                return Json(elecDevicesSelectList, JsonRequestBehavior.AllowGet);
            }
            return null;
        }

这是视图模型:

public class ElecDevConfigSelectionViewModel
    {
        public int? EventVendorID { get; set; }
        public EventVendor EventVendor { get; set; }

        [Display(Name = "Category")]
        public int SelectedCategory { get; set; }
        public IList<SelectListItem> Categories { get; set; }

        [Display(Name = "Electrical Device")]
        public int? ElectricalDeviceID { get; set; }
    }

以下是添加新电子设备的控制器方法:

// GET: ElectricalDevices/AddNew
        public ActionResult AddNew(string returnUrl)
        {
            ViewBag.ReturnUrl = returnUrl;
            var selectedCategoryId = db.ElectricalDeviceCategoryLookups.FirstOrDefault().ID;
            return View(new AddNewElectricalDeviceViewModel { ReturnUrl = returnUrl, Categories = GetCategories(), SelectedCategory = null });
        }

        // POST: ElectricalDevices/AddNew
        // 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 ActionResult AddNew(AddNewElectricalDeviceViewModel model)
        {
            if (ModelState.IsValid)
            {
                var selectedCategory = db.ElectricalDeviceCategoryLookups.Find(model.SelectedCategory);
                var electricalDevice = new ElectricalDevice 
                { 
                    Name = model.ElectricalDevice.Name, 
                    Description = model.ElectricalDevice.Description, 
                    Category = selectedCategory.Category, 
                    Wattage = model.ElectricalDevice.Wattage 
                };
                db.ElectricalDevices.Add(electricalDevice);
                db.SaveChanges();
                var returnUrl = string.Format("{0}&newElecDev={1}", model.ReturnUrl, electricalDevice.ID);
                return RedirectToLocal(returnUrl);
            }

            return View();
        }

这是用于添加新电子设备的视图模型:

public class AddNewElectricalDeviceViewModel
    {
        public string ReturnUrl { get; set; }

        [Display(Name = "Category")]
        public int? SelectedCategory { get; set; }
        public IList<SelectListItem> Categories { get; set; }
        public ElectricalDevice ElectricalDevice { get; set; }
    }

0 个答案:

没有答案