【问题标题】:Model binding nested collections in editor templates编辑器模板中的模型绑定嵌套集合
【发布时间】:2013-05-09 03:17:20
【问题描述】:

我有一个用于视图模型的编辑器模板EditFeeContentViewModel。此视图模型包含一个通过 JavaScript 添加/删除的集合。每当添加新项目时,我都会通过微模板添加以下 HTML,以便模型绑定起作用:

<script id="feeContentTemplate" type="text/html">
    <tr id='RowContentId<%= ContentId%>'>
        <td>
            <input type="hidden" name="ContentFeeViewModels.Index" value="<%= ContentId%>"/>
            <input type="hidden" name="ContentFeeViewModels[<%= ContentId%>].ContentId" value="<%= ContentId%>" />
            <%= ContentId%>
        </td>
        <td><input type="hidden" name="ContentFeeViewModels[<%= ContentId%>].ContentName" value="<%= ContentName%>" />
            <%= ContentName%>
        </td>
        <td><input type="text"     name="ContentFeeViewModels[<%= ContentId%>].Allocation" value="<%= Allocation%>" /></td>
        <td><input type="text"     name="ContentFeeViewModels[<%= ContentId%>].Comments" value="<%= Comments%>"/></td>
        <td><a href="javascript:removeContentRow('#RowContentId<%= ContentId%>')">Remove</a></td>
    </tr>
</script>

现在,当我的视图模型没有嵌套时,这可以正常工作。它提交给控制器,所有数据都完好无损,等等。

但是,当它嵌套时,显然名称不再正确,模型绑定失败。我可能需要FeeContents.ContentFeeViewModels.Index,而不是ContentFeeViewModels.Index。

由于这是通过 JavaScript 完成的,我不知道如何使用 HTML 帮助程序正确生成名称。如何确定视图模型是否嵌套/在哪里嵌套并生成一个字符串来表示其位置,以便模型绑定正确发生?

我考虑过在EditFeeContentViewModel 中手动设置一个字符串,父视图模型可以设置该字符串来表示属性名称,但这似乎很麻烦且容易出错。有更好的方法吗?

【问题讨论】:

标签: c# javascript asp.net-mvc


【解决方案1】:

我发现你可以使用ViewData.TemplateInfo.HtmlFieldPrefix 来获取路径值。

所以我的代码现在看起来像:

var contentFeeModelPrefix = "";
if ("@ViewData.TemplateInfo.HtmlFieldPrefix" != "") {
    contentFeeModelPrefix = "@ViewData.TemplateInfo.HtmlFieldPrefix" + ".";
}

然后我可以在我的 JavaScript 中使用该变量作为各个字段的前缀。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多