我不明白为什么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
答案 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
。