将模型的 IEnumerable 属性传递给控制器​​后操作 - ASP MVC

2024-04-26

我正在开发一个 asp-MVC 应用程序并面临以下问题: 这是一个工作代码:

<div id="detailsTemplates">
            @for (var i = 0; i < Model.Filter.itemDetails.Count; i++)
            {
                <table>
                    <tr>
                        <td>
                            @Html.TextBoxFor(model => model.Filter.itemDetails[i].iD)
                        </td>

                    </tr>
                </table>
            }

现在,在我的控制器的后操作中,我正确地获得了插入的值。

现在,当我将代码更改为部分视图时:

<div id="detailsTemplates">
            @for (int i = 0; i < Model.Filter.itemDetails.Count; i++)
            {
                Html.RenderPartial("itemDetailsUserControl", Model.Filter.itemDetails[i]);
            }



        </div>

部分视图如下所示:

<div id="detailsTemplates">
<table>
    <tr>
        <td>
            @Html.TextBoxFor(item => item.iD)
        </td>

    </tr>
</table>
}        

现在,价值不再通过邮寄转移。

我究竟做错了什么?


视图中模型的上下文来自传递给它的模型。 例如。通过传递

Model.Filter.CustomsitemDetails[i]

对于您的部分,您已将根从 Model 对象更改为 CustomiseDetails 对象。 (因此输入的名称将是“CustomsItemClassificationID”而不是“Filter.CustomsitemDetails[i].CustomsItemClassificationID”,因此在发布时不会反弹,因为将不再匹配它所绑定到的属性。

正确的方法是使用编辑器模板。这将保留模型的起源。为此,请在“视图”>“共享”下创建一个名为 EditorTemplates 的文件夹。

将您的部分复制到其中,并将其重命名为您的类型的名称。例如,如果 Model.Filter.CustomsitemDetails[i] 的类型为 CustomsitemDetail,则编辑器模板文件夹下的文件将称为 CustomsitemDetails.cshtml。

现在,代替

@Html.RenderPartial("CustomsItemDetailsUserControl", Model.Filter.CustomsitemDetails[i]);

Use

@Html.EditorFor(m => m.Filter.CustomitemDetails[i])

Alternatively, if you don't want to rename or move your file, you can specify it's current location instead:

@Html.EditorFor(m => m.Filter.CustomitemDetails[i], "~/Views/{controller}/CustomsItemDetailsUserControl.cshtml")

UPDATE

所以我学到了一些新东西:

如果在控制器的 EditorTemplates 文件夹中找到名称与 templateName 参数匹配的模板,则使用该模板来呈现表达式。如果在控制器的 EditorTemplates 文件夹中找不到模板,则会在 Views\Shared\EditorTemplates 文件夹中搜索与 templateName 参数名称匹配的模板。如果没有找到模板,则使用默认模板。 from MSDN https://msdn.microsoft.com/en-us/library/ee407414(v=vs.118).aspx.

因此,与我答案的第二部分相反,您确实需要将您的部分移至

"~/Areas/TaxCalculation/Views/Home/EditorTemplates/CustomsItemDetailsUserControl.cshtml"

And use:

@Html.EditorFor(m => m.Filter.CustomitemDetails[i], "CustomsItemDetailsUserControl")

UPDATE 2

根据斯蒂芬的评论 - EditorFor() 有一个接受 IEnumerable 的重载,所以你可以使用

@Html.EditorFor(m => m.Filter.CustomitemDetails, "CustomsItemDetailsUserControl")

或者,如果您有一个名为 CustomitemDetails.cshtml 的 EditorTemplate,位于 /Views/Shared/EditorTemplates/ 文件夹中:

@Html.EditorFor(m => m.Filter.CustomitemDetails)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将模型的 IEnumerable 属性传递给控制器​​后操作 - ASP MVC 的相关文章

随机推荐