2015-05-22 75 views
2

當在模型空這是我的模型:MVC的SelectList回發到控制器

[Display(Name = "Company")] 
public int CompanyId { get; set; } 

public SelectList Companies { get; set; } 

設定數據視圖

[HttpGet] 
    [AllowAnonymous] 
    public ActionResult Index() 
    { 
     var model = new Ticket 
     { 
      Companies = new SelectList(new List<SelectListItem> { new SelectListItem { Text = "0", Value = "0" } }, "Value", "Text") 
     }; 
     return View(model); 
    } 

的觀點:

<div class="form-group"> 
     @Html.LabelFor(m => m.CompanyId, new { @class = "col-md-6 col-md-pull-1 control-label" }) 
     <div class="col-md-3 col-md-pull-1"> 
      @Html.DropDownListFor(m => m.CompanyId, Model.Companies, new { @class = "selectpicker form-control" }) 
     </div> 
    </div> 

結果:

This is the result

我怎樣才能得到SelectList被回發給控制器,所以我不必繼續填充它?

+0

所以你想返回傳遞給第一次查看的整個列表? –

+4

你沒有。您需要爲每個「SelectListItem」的每個「Value」和「Text」屬性生成一個隱藏的輸入,這會顯着增加發送到視圖然後再返回的數據量。如果你需要返回視圖(如果你有'ModelState'錯誤,並且使用客戶端驗證將減少這種情況發生的可能性,那麼應該只是這種情況) –

+1

And'Companies =新的SelectList(新列表 {新的SelectListItem {文本=「0」,值=「0」}},「價值」,「文本」)是無稽之談。你已經有'List '(這是'@ Html.DropDownListFor()'要求的)。從現有的「SelectList」中創建另一個「SelectList」是沒有意義的。 –

回答

1

Model.Companies不會被綁定,因爲不在窗體中,ModelBinder正在窗體中查找輸入或查找具有屬性名稱(本例中爲公司)的querystring值,但您沒有與此名字相反,您有一個名稱爲CompanyId的字段,這就是爲什麼CompanyId是綁定的。

保存公司列表並在Post操作中獲得它的一個好方法是使用TempData,使用TempData可以將項目保存在某個操作中,並且它將在下一個操作中可用。就像會話一樣,但只是一個請求。