我认为 - 除其他外 - 包含元素列表。我想重用这个列表,所以我把它移到局部视图。我的视图包含一个表单,在帖子上我想在列表中包含一些值。因此,我使用@Html.EditorFor(m => m.Something)
生成输入框,这将获得唯一的ID。该视图是强类型,使用“MyModel”作为模型。在帖子上,MVC框架可以很好地处理所有事情 - 将值重新组合到包含输入的MyModel对象和我使用Html.HiddenFor
的一些字段。都好。
现在我将其移至局部视图。部分视图仅适用于列表,因此强类型化为List模型。我从主视图中包含此视图,并传入我希望它呈现的列表。部分视图中的表代码与之前的完全相同,只是它被更改为从列表而不是MyModel获取值。所有数据都完美显示,但存在问题。输入框不再获得Id。并且因为他们没有得到Id他们的值不包含在发布的表单中 - 因此他们没有出现在模型中我作为输入到我的post方法。我尝试使用@Html.Partial("_MyPartial", Model.Items)
和@{Html.RenderPartial("_MyPartial", Model.Items);}
所以问题是;如何使用局部视图进行此工作?我如何才能获得该ID?
以下是一些示例代码,以防有任何不清楚的地方:
MyModel.cs
----------
public class MyClass
{
public string Val1 { get; set; }
public string Val2 { get; set; }
}
public class MyModel
{
public List<MyClass> Items {get; set; }
}
MyView.cshtml:
--------------
@model MyModel
using (Html.BeginForm("SomeAction", "SomeController", FormMethod.Post))
{
@Html.Partial("_MyPartial", Model.Items)
}
_MyPartial.cshtml:
------------------
@model List<MyClass>
<table>
<tbody>
for (var i = 0; i< Model.Count; i++)
{
<tr>
<td>
@Model[i].Val1
@Html.HiddenFor(model => model[i].Val1)
</td>
<td>@Html.EditorFor(model => model[i].Val2)</td>
</tr>
}
</tbody>
</table>
答案 0 :(得分:1)
您也必须为Model.Items
使用EditorFor。
因此,将_MyPartial更改为更相关的内容,例如MyEditorForMyClass.cshtml
。
在共享或您正在使用的文件夹中创建一个“EditorTemplates
”文件夹,然后将“MyEditorForMyClass.cshtml
”文件放入其中。
然后执行以下操作:
MyView.cshtml:
--------------
@model MyModel
using (Html.BeginForm("SomeAction", "SomeController", FormMethod.Post)
{
@Html.EditorFor(model => Model.items,"MyEditorForMyClass"}
}
EditorFor templates / helper方法允许您渲染标准数据类型和包含多个属性的自己的复杂对象。