今天早上我已經向Razor介紹了應用於MVC 3,所以請原諒我,如果我的問題似乎非常不瞭解!DropDownListFor使用會話狀態的SelectedValue和Disable
我有一個應用程序,其工作流程涉及允許用戶選擇從下拉列表中的值(倉庫)的工作,並從該倉庫的記錄(材料)添加到另一個記錄(材料申請)。一旦第一個材料被添加到材料請求中,我需要永久性地將下拉的值設置到首先選擇的倉庫,然後禁用下拉控件(或者設置爲只讀,也許)。 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」。但是,我不知道如何獲取該值重新視圖(道歉大碼塊這裏):
[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中,但說實話,我並不知道ViewBag通過隨機修改它的內容來識別我可能面臨的任何意想不到的後果。
感謝您對此提供的任何幫助。
謝謝,斯圖爾特,解決了我遇到的禁用問題。我還能夠追蹤解決我的第二個問題;在控制器中,我註釋了線路模型。WarehouseId = null; ,它允許先前選擇的WarehouseId傳回到視圖中。在這一點上選擇啓用和禁用是一件簡單的事情。 –