2012-09-11 32 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

相关问题