【发布时间】:2010-03-11 15:07:16
【问题描述】:
我有一个带有“MapColumns”操作的 ASP.Net MVC 控制器以及相应的 ViewModel 和 View。
我正在使用 defaultModelBinder 将多个下拉列表绑定到 ViewModel 中的字典。视图模型还包含用于呈现视图的源列和目标列的 IList 字段。
我的问题是当对 MapColumns 操作的 Post 调用验证失败时该怎么办?
目前 MapColumns 视图与默认绑定产生的 ViewModel 一起返回。这包含 Dictionary 值,但不包含用于呈现页面的两个列表。将这些重新提供给视图的最佳方式是什么?
我可以在验证失败后显式设置它们,但如果获取这些值(通过示例中的 GetSourceColumns() 和 GetDestinationColumns())会带来任何开销,这似乎并不理想。我正在寻找的是一种在这些列表未从视图绑定到模型时保留这些列表的方法。
这里有一些代码来说明:
public class TestViewModel
{
public Dictionary<string, string> ColumnMappings { get; set; }
public List<string> SourceColumns;
public List<string> DestinationColumns;
}
public class TestController : Controller
{
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult MapColumns()
{
var model = new TestViewModel;
model.SourceColumns = GetSourceColumns();
model.DestinationColumns = GetDestinationColumns();
return View(model);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult MapColumns(TestViewModel model)
{
if( Validate(model) )
{
// Do something with model.ColumnMappings
RedirectToAction("Index");
}
else
{
// Here model.SourceColumns and model.DestinationColumns are empty
return View(model);
}
}
}
MapColumns.aspx的相关部分:
<%
int columnCount = 0;
foreach(string column in Model.targetColumns)
{%>
<tr>
<td>
<input type="hidden" name="ColumnMappings[<%= columnCount %>].Value" value="<%=column %>" />
<%= Html.DropDownList("ColumnMappings[" + columnCount + "].Key", Model.DestinationColumns.AsSelectItemList())%>
</td>
</tr>
<%
columnCount++;
}%>
【问题讨论】:
标签: asp.net-mvc binding viewmodel