2011-10-03 21 views
1

今天早上我已經向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通過隨機修改它的內容來識別我可能面臨的任何意想不到的後果。

感謝您對此提供的任何幫助。

回答

0

沒有進入哪種方法比較好...

你的下拉應該呈現爲一個HTML 選擇元素,以禁用此您將需要一個disabled="disabled"屬性添加到它。

DropDownListFor方法具有htmlAttributes參數,你可以用它來實現這一目標:

new { disabled = "disabled" } 
+0

謝謝,斯圖爾特,解決了我遇到的禁用問題。我還能夠追蹤解決我的第二個問題;在控制器中,我註釋了線路模型。WarehouseId = null; ,它允許先前選擇的WarehouseId傳回到視圖中。在這一點上選擇啓用和禁用是一件簡單的事情。 –

0

時,如果WareHouseID設置在model通票模型視圖像

return View("Create", model); 

那麼

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

將自動設置所選值,並且您不必爲此執行會話處理。至於禁用一個字段是必需的,斯圖爾特是正確的。你可以以這種方式禁用下拉菜單,但是當你提交表單時,它不會被髮布到服務器上。你可以將其設置爲只讀模式,如

new{@readonly = "readOnly"}