今天早上我已经介绍过应用于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,只是随机修改它的内容,以识别我可能面临的任何意想不到的后果。
感谢您提供的任何帮助。
答案 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"}