维护具有默认模型绑定和失败验证的ViewModel字段

时间:2010-03-11 15:07:17

标签: asp.net-mvc binding viewmodel

我有一个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++;
}%>

1 个答案:

答案 0 :(得分:1)

如果验证失败,您必须重新绑定模型。在您的else语句中,只需在再次返回视图之前添加model.SourceColumns = GetSourceColumns();model.DestinationColumns = GetDestinationColumns();