2012-09-11 86 views
0

我有一個包含list nad過濾器選項的視圖。我需要添加選項來一次更新列表中的選定項目。查看與列表和過濾選項看起來短這樣的:如何將值從複選框傳遞給控制器​​?

@model GWeb.Models.FilterModel 
@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>Search criteria</legend> 
      @Html.LabelFor(model => model.ProjectId, "Project")  
      @Html.DropDownList("ProjectId", 
      new SelectList(ViewBag.projectListDesciption as System.Collections.IEnumerable, "Id", "Desciption"), "all") 

      @Html.LabelFor(model => model.StartWork, "From Date")  
      @(Html.Telerik().DatePicker() 
      .Name("StartWork") 
      .Value(Model.StartWork)) 

     <input type="submit" value="Filter" name="submitButton"/> 
    </fieldset> 
    <fieldset> 
     <legend>Status change</legend>   
      Change status on selected:   
      @Html.DropDownList("Status", 
      new SelectList(ViewBag.statusList as System.Collections.IEnumerable, "Id", "Description")) 

     <input type="submit" value="Update" name="submitButton"/> 
    </fieldset> 
} 

@{Html.RenderPartial("WorkList", Model.workList);} 

凡列表局部視圖呈現在短期看起來像這樣:所使用的

@model IEnumerable<GWeb.Models.WorkModel> 
    @foreach (var item in Model) 
    { 
     <tr> 
      <td> 
      @Html.CheckBox("chb" + item.Id, item.Selected) 
      </td> 
      ... 
     </tr> 
    } 

這裏是模型:

 public class FilterModel 
    { 
     public int ProjectId { get; set; }   
     public DateTime? StartWork { get; set; } 
     public int? Status { get; set; } 

     public List<WorkModel> workList { get; set; } 
    } 

    public class WorkModel 
    { 
     public int Id { get; set; } 
     ...   
     public bool Selected { get; set; } 
    } 

在控制器中,我正在檢查單擊了哪個按鈕。如果它是'更新',我想執行修改。但workFilter.workList始終爲空。

public ActionResult WorkManager(FilterModel workFilter, string submitButton) 
    {    
     if (submitButton == "Update") 
     { 
      if (workFilter.workList != null) 
      { 
       //... 
      }    
     } 
     else 
     { 
      //filter 
     } 
     //...   
     return View(workFilter); 

我該如何檢查控制器中的複選框是否被選中更新?

任何幫助非常感謝!

回答

1

你應該看看How to produce non-sequential prefix collection indices with MVC HTML Editor templates?,因爲對於任何稍微複雜的事情你都需要做類似的事情。

快速解決問題的方法是:

//instead of: @{Html.RenderPartial("WorkList", Model.workList);} write code below inside using statement(below </fieldset>) 


    @for (int i = 0; i < Model.worklist.Count; i++) 
    { 
     <tr> 
      <td> 
      @Html.HiddenFor(x => x.workList[i].Id) 
      @Html.CheckBoxFor(x => x.workList[i].Selected) 
      </td> 
      ... 
     </tr> 
    } 

警告:上面的代碼沒有進行測試,但我勸你看看在上面的答案。

0

爲了避免workList爲NULL問題,可以將代碼添加到您的FilterModel默認構造函數(無參數構造函數)中,以使用虛擬項創建並初始化workList。

請讓我知道這是否解決了這個問題。

更新:

請原諒我沒有澄清添加代碼到構造方法的效果。不,它不會創建新的模型。它所做的是初始化workList,以便Controller可以訪問其中的索引元素。

示例代碼:

public FilterModel(){ 
    workList = new List<WorkModel>(); 
    for(int i = 0; i < MAX_WORKMODEL_COUNT; i++){ 
    workList.Add(new WorkModel()); 
    } 
} 
+0

這將創造新的FilterModel - 但我不希望創建一個新的。我需要使用現有的和它的價值觀。 – Marta

相關問題