【问题标题】:Maintaining ViewModel fields with default model binding and failed validation使用默认模型绑定和验证失败维护 ViewModel 字段
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复。我真的想知道是否有一种聪明的方法可以避免再次调用 GetSourceColumns() GetDistnationColumns()。由于似乎没有,我将通过再次调用函数来重新填充这些字段,并在以后证明有问题时考虑提高函数的效率。
    • 这正是我所做的;努力提高这些调用的效率。
    猜你喜欢
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    相关资源
    最近更新 更多