2011-06-29 31 views
2

在我MVC3项目,我有以下型号:MVC3提交对我的复杂数据类型返回null

public class CustomerModules 
{ 
    public int ModuleId { get; set; } 
    public string ModuleName { get; set; } 
    public int CustId { get; set; } 
    public bool IsActive { get; set; } 
    public DateTime? ActiveDate { get; set; } 
} 

public class CustomerModuleList 
{ 
    public IEnumerable<CustomerModules> Modules { get; set; } 
} 

我的控制器如下:

[HttpGet] 
public ActionResult EditModules(int custNo) 
{ 
    var model = new CustomerModuleList 
    { 
     Modules = _customerModules.LoadModulesByCustomerId(custNo) 
    }; 

    return View(model); 
} 

[HttpPost] 
public ActionResult EditModules(CustomerModuleList model) 
{ 
    if (ModelState.IsValid) 
    { 
     var custId = model.Modules.First().CustId; 

     _customerModules.UpdateCustomerModules(model.Modules, custId); 
    } 

    return View(model); 

} 

而我的看法片段是:

<% using (Html.BeginForm("EditModules","Admin",FormMethod.Post, new { enctype = "multipart/form-data" })){ %> 
    <%: Html.ValidationSummary(true) %> 
    <fieldset> 
     <legend>CustomerModuleList</legend> 

     <table> 
      <tr> 
       <th>Module Name</th> 
       <th>Active</th> 
       <th>Active Date</th> 
      </tr> 
      <% foreach (var module in Model.Modules){%> 
       <tr> 

        <td><%:Html.Label(module.ModuleName) %></td> 
        <td> 
         <%CustomerModules module1 = module;%> 
         <%:Html.CheckBoxFor(x=>module1.IsActive) %> 
        </td> 
        <td><%:Html.Label(module.ActiveDate.ToString()) %></td> 
       </tr> 
      <% } %> 
     </table> 
     <p> 
      <input type="submit" value="Save" /> 
     </p> 
    </fieldset> 
<% } %> 

当我提交回控制器IEnumerable<CustomerModules>模块返回为空。我想知道如何在MVC3中提交复杂类型的IEnumerable?想法任何人?

回答

3

问题是你没有指定表单提交的对象是CustomerModuleList类型。

在您的views/Shared/EditorTemplates文件中创建名为CustomerModuleList.cshtml和CustomerModules.cshtml的视图。

在CustomerModuleList.cshtml把

@model CustomerModuleList 
<% foreach (var module in Model.Modules){%> 
      Html.EditorFor(x => module); 
     <% } %> 

,然后在CustomerModules.cshtml坚持

@model CustomerModules 
<tr> 
       <td><%:Html.Label(Model.ModuleName) %></td> 
       <td> 
        <%:Html.CheckBoxFor(x=>x.IsActive) %> 
       </td> 
       <td><%:Html.Label(Model.ActiveDate.ToString()) %></td> 
      </tr> 

那么在你看来片段与

Html.EditorFor(x => Model) 

与测试此替换for循环与我创建的类型不同的IEnumerable,它工作。

2

这是一个类似但无关的问题。我在这里添加它,希望我可以节省一些其他可怜的开发人员4个小时的故障排除。我不知道这是否仅仅在我的系统上,但是...在MVC 3中,我发现如果Model包含任何类型的名为Member或OrgMember的list属性(list,ienumerable,array ...),则模型绑定器将彻底失败!去搞清楚。

+0

非常感谢,我使用MVC 4,并有同样的问题。然而我的名单被称为别的东西,我创建了这个问题,但我发现重命名列表名称帮助... http://stackoverflow.com/questions/22982096/strange-behaviour-with-mvc-posting-list – raklos