我有一个ASP.Net MVC控制器,带有'MapColumns'动作以及相应的ViewModel和View。
我正在使用defaultModelBinder将多个下拉列表绑定到ViewModel中的Dictionary。视图模型还包含用于呈现视图的源列和目标列的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++;
}%>
答案 0 :(得分:1)
如果验证失败,您必须重新绑定模型。在您的else语句中,只需在再次返回视图之前添加model.SourceColumns = GetSourceColumns();
和model.DestinationColumns = GetDestinationColumns();
。