DropDownListFor SelectedValue and Disable using Session Stat

本文关键字:Session Stat using Disable SelectedValue and DropDownListFor | 更新日期: 2023-09-27 18:10:16

今天早上我已经介绍了Razor与MVC 3的应用,所以如果我的问题看起来非常无知,请原谅我!

我正在使用一个应用程序,其工作流程涉及允许用户从下拉列表中选择一个值(仓库),并将记录(材料)从仓库添加到另一个记录(材料请求)。将第一个材料添加到Materials Request之后,我需要将下拉菜单的值永久地设置为第一次选择的仓库,然后禁用下拉菜单控件(或者设置为只读)。razor文件中的现有代码使用DropDownListFor()方法,包括仓库记录的ViewBag集合。我看到有人建议放弃ViewBag设计,但老实说,我并不想重写大部分代码;至少从我的经验水平来看,这是一次重大的重写。以下是原始代码:

@Html.LabelPlusFor(m => m.WarehouseId, "*:")
@Html.DropDownListFor(m => m.WarehouseId, (IEnumerable<SelectListItem>)ViewBag.WarehouseCodes, "")<br />

我相信我已经能够选择基于会话对象的值,尽管我仍然不确定如何禁用该控件。这是找我的钱:

    @{ 
        int SelectedWarehouseId = -1;
        if (HttpContext.Current.Session["SelectedWarehouseId"] != null)
        {
            SelectedWarehouseId = Int32.Parse(HttpContext.Current.Session["SelectedWarehouseId"].ToString());
        }
    }
    @Html.LabelPlusFor(m => m.WarehouseId, "*:")
    @{
        if (SelectedWarehouseId > -1)
        {
            @Html.DropDownListFor(m => m.WarehouseId, new SelectList((IEnumerable<SelectListItem>)ViewBag.WarehouseCodes, "WarehouseId", "WarehouseDescription", (int)SelectedWarehouseId))<br />
        }
        else
        {
            @Html.DropDownListFor(m => m.WarehouseId, (IEnumerable<SelectListItem>)ViewBag.WarehouseCodes, "")<br />
        }
    }

当材料被添加到material Request中时,WarehouseId被传递给控制器,我可以访问该值为"model"。WarehouseId"在控制器类中。但是,我不确定如何将该值返回给视图(为这里的大代码块道歉):

    [HttpPost]
    [TmsAuthorize]
    public ActionResult Create(ItemRequestViewModel model)
    {
        string deleteKey = null;
        //Removed code
        else if (Request.Form["AddToRequest"] != null)
        {
            // If the user clicked the Add to Request button, we are only
            // interested in validating the following fields. Therefore,
            // we remove the other fields from the ModelState.
            string[] keys = ModelState.Keys.ToArray();
            foreach (string key in keys)
            {
                if (!_addToRequestFields.Contains(key))
                    ModelState.Remove(key);
            }
            // Validate the Item Number against the database - no sense
            // doing this if the ModelState is already invalid.
            if (ModelState.IsValid)
            {
                _codes.ValidateMaterial("ItemNumber", model.ItemNumber, model.WarehouseId);
                Session["SelectedWarehouseId"] = model.WarehouseId;
            }
            if (ModelState.IsValid)
            {
                // Add the new Item Request to the list
                model.Items.Add(new ItemViewModel() { ItemNumber = model.ItemNumber, Quantity = model.Quantity.Value, WarehouseId = model.WarehouseId });
                ModelState.Clear();
                model.ItemNumber = null;
                model.Quantity = null;
                model.WarehouseId = null;
            }
        }
        //Removed code
        return CreateInternal(model);
    }
    private ActionResult CreateInternal(ItemRequestViewModel model)
    {
        if (model != null)
        {
            if (!String.IsNullOrEmpty(model.SiteId))
            {
                ViewBag.BuildingCodes = _codes.GetBuildingCodes(model.SiteId, false);
                if (!String.IsNullOrEmpty(model.BuildingId))
                    ViewBag.LocationCodes = _codes.GetLocationCodes(model.SiteId, model.BuildingId, false);
            }
            //Removed code
        }
        //Removed code
        ViewBag.WarehouseCodes = _codes.GetWarehouseCodes(false);
        return View("Create", model);
    }

所以我的问题是,我如何禁用下拉列表,以及我如何将所选WarehouseId的值传递回视图?我也考虑过将值添加到ViewBag,但说实话,我对ViewBag的了解不够,无法通过随机修改它的内容来识别我可能面临的任何意外后果。

感谢您的帮助

DropDownListFor SelectedValue and Disable using Session Stat

不讨论哪种方法更好…

你的下拉菜单应该呈现为HTML select元素,为了禁用这个,你需要添加一个disabled="disabled"属性给它。

DropDownListFor方法有一个 htmlatattributes 参数,你可以使用它来实现:

new { disabled = "disabled" }

当你将模型传递给你的视图时

return View("Create", model);

如果WareHouseID设置在model中,则

Html.DropDownListFor(x=>x.WareHouseID, ...)

将自动设置所选值,您不必为此进行会话处理。就需要禁用字段而言,stewart是对的。你可以禁用下拉菜单,但是当你提交表单时,它不会被发送到服务器。您可以将其设置为只读模式,如

new{@readonly = "readOnly"}