视图中模型的上下文来自传递给它的模型。
例如。通过传递
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)