DropDownListFor SelectedValue和使用会话状态禁用

时间:2011-10-03 18:41:09

标签: c# asp.net-mvc-3 razor

今天早上我已经介绍过应用于MVC 3的Razor,所以如果我的问题看起来非常不明白,请原谅我!

我正在使用一个应用程序,其工作流程涉及允许用户从下拉列表中选择值(仓库),并将该仓库中的记录(材料)添加到另一个记录(材料请求)。将第一个材料添加到材料请求后,我需要将下拉值永久设置为首先选择的仓库,然后禁用下拉控件(或者设置为只读)。剃刀文件中的现有代码使用DropDownListFor()方法,包括Warehouse记录的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 />
        }
    }

当材料添加到材料请求时,WarehouseId将传递给控制器​​,我可以在控制器类中将该值作为“model.WarehouseId”访问。但是,我不确定如何将该值返回到View(此处为大代码块道歉):

    [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,只是随机修改它的内容,以识别我可能面临的任何意想不到的后果。

感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:0)

没有采用哪种方法更好......

您的下拉列表应该呈现为HTML 选择元素,为了禁用此功能,您需要为其添加disabled="disabled"属性。

DropDownListFor方法有一个 htmlAttributes 参数,您可以使用该参数来实现此目的:

new { disabled = "disabled" }

答案 1 :(得分:0)

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

return View("Create", model);

如果在WareHouseID中设置了model,那么

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

将自动设置所选值,您不必为此进行会话处理。至于需要禁用某个领域,斯图尔特是对的。您可以通过这种方式禁用下拉菜单,但是当您提交表单时它将不会发布到服务器。您可以将其设置为只读模式,如

new{@readonly = "readOnly"}