为什么MVC3中的DefaultModelBinder没有绑定?

时间:2011-05-16 13:26:48

标签: c# data-binding asp.net-mvc-3

我不明白为什么MVC3中的 DefaultModelBinder 没有将Form Post Data映射到我的action方法。我有以下 ViewModels

public class DisplayExcelTableViewModel
{
   public string UploadedFileName { get; set; }
   public List<string> TableHeaders { get; set; }
   public List<TableRowViewModel> TableRows { get; set; }
}

public class TableRowViewModel
{
   public List<string> TableColumns { get; set; }
}

它们使用 DisplayTemplates 显示在(部分)视图中:

@using (Html.BeginForm("SubmitExcel", "Home", FormMethod.Post))
{ 
<fieldset>

<table>
<tr>
<th>@Html.DisplayFor(m => m.TableHeaders)</th>//<input id="TableHeaders_0_" name="TableHeaders[0]" type="text" value="Opportunity Id" />
</tr>

<tr>
<td>@Html.DisplayFor(m => m.TableRows)</td>//<input id="TableRows_0__TableColumns_0_" name="TableRows[0].TableColumns[0]" type="text" value="1-H7PKD9" />
</tr>

</table>           


<input type="submit" value="Send" />
</fieldset> 
}

动作方法如下:

public ActionResult SubmitExcel(DisplayExcelTableViewModel excelTable)

要尝试是否仅使用一个 TableRows ,我尝试了:

public ActionResult SubmitExcel([Bind(Prefix = "TableRows")] TableRowViewModel TableRows)

要测试我还尝试放置List<TableRows>并取出绑定属性。这是行不通的。 我遇到了运行时异常:

“System.MissingMethodException:没有为此对象定义无参数构造函数。”

你能告诉我我做错了吗?

感谢Francesco

2 个答案:

答案 0 :(得分:2)

问题是我的ViewModels DID NOT 有一个无参数构造函数,这是默认模型Binder 查找的内容(使用.NET的Activator.CreateInstance()方法,它依赖于具有公共无参数构造函数的那些类型。)在这种情况下的解决方案是两个:

1)向ViewModel和其中包含的其他自定义类添加无参数构造函数。

2)创建一个自定义模型绑定器,它也包含ViewModel

的情况

由于

来源:Pro ASP.NET MVC2框架(第2版)

答案 1 :(得分:0)

您是否检查过(例如使用Firebug)是否将表单值发布到服务器?我问,因为Html.DisplayFor通常呈现显示元素,而对于发布值,您通常必须使用Html.EditorFor