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的了解不够,无法通过随机修改它的内容来识别我可能面临的任何意外后果。
感谢您的帮助
不讨论哪种方法更好…
你的下拉菜单应该呈现为HTML select元素,为了禁用这个,你需要添加一个disabled="disabled"
属性给它。
DropDownListFor
方法有一个 htmlatattributes 参数,你可以使用它来实现:
new { disabled = "disabled" }
当你将模型传递给你的视图时
return View("Create", model);
如果WareHouseID
设置在model
中,则
Html.DropDownListFor(x=>x.WareHouseID, ...)
将自动设置所选值,您不必为此进行会话处理。就需要禁用字段而言,stewart是对的。你可以禁用下拉菜单,但是当你提交表单时,它不会被发送到服务器。您可以将其设置为只读模式,如
new{@readonly = "readOnly"}