如何将 EditorFor 与 ViewData 作为源一起使用?
How can I use EditorFor with ViewData as source?
我在控制器上设置了一个 ViewData,例如:
ViewData["Registrations_Services"] = GetServices(); // return a List<Services>
然后,我想在我的视图中显示它。之前,我正在使用模型进行迭代:
@Html.EditorFor(m => m.Services)
但现在如何从 ViewData 执行相同的操作?尝试过:
@foreach (var item in ViewData["Registrations_Services"] as IList<MyProject.Models.Services>)
{
@Html.EditorFor(item)
}
但是类型参数不同,当然不行。
也尝试过:
@Html.EditorFor(m => ViewData["Registrations_Services"] as IList<MyProject.Models.Services>)
但是它说
Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
我需要为每个项目应用编辑器模板 Services.cshtml
:
<div class="form-group">
@Html.Label(Model.Description, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-6 checkbox">
@Html.HiddenFor(m => m.Id)
@Html.HiddenFor(m => m.Name)
@Html.HiddenFor(m => m.RegistrationId)
@Html.HiddenFor(m => m.Description)
@Html.EditorFor(m => m.Enabled)
</div>
<div class="col-md-4"></div>
</div>
这就是我使用 @Html.EditorFor(m => m.Services)
的原因。
您可以使用 non-strong 键入的版本,使用 ViewData
键的名称
@Html.Editor("Registrations_Services")
请注意,这将生成
<input name="Registrations_Services[0].Id" ... />
<input name="Registrations_Services[0].Name" ... />
....
<input name="Registrations_Services[1].Id" ... />
<input name="Registrations_Services[1].Name" ... />
etc(即前缀为Viewdata
键),所以POST方法需要包含一个与ViewData
键同名的参数才能正确绑定
IEnumerable<Services> Registrations_Services
话虽如此,您正在编辑数据,因此您应该始终使用视图模型,而不是视图中的数据模型,视图模型将包含一个IEnumerable<Services> Services
属性,使您不必使用 ViewData
。
我在控制器上设置了一个 ViewData,例如:
ViewData["Registrations_Services"] = GetServices(); // return a List<Services>
然后,我想在我的视图中显示它。之前,我正在使用模型进行迭代:
@Html.EditorFor(m => m.Services)
但现在如何从 ViewData 执行相同的操作?尝试过:
@foreach (var item in ViewData["Registrations_Services"] as IList<MyProject.Models.Services>)
{
@Html.EditorFor(item)
}
但是类型参数不同,当然不行。
也尝试过:
@Html.EditorFor(m => ViewData["Registrations_Services"] as IList<MyProject.Models.Services>)
但是它说
Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
我需要为每个项目应用编辑器模板 Services.cshtml
:
<div class="form-group">
@Html.Label(Model.Description, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-6 checkbox">
@Html.HiddenFor(m => m.Id)
@Html.HiddenFor(m => m.Name)
@Html.HiddenFor(m => m.RegistrationId)
@Html.HiddenFor(m => m.Description)
@Html.EditorFor(m => m.Enabled)
</div>
<div class="col-md-4"></div>
</div>
这就是我使用 @Html.EditorFor(m => m.Services)
的原因。
您可以使用 non-strong 键入的版本,使用 ViewData
键的名称
@Html.Editor("Registrations_Services")
请注意,这将生成
<input name="Registrations_Services[0].Id" ... />
<input name="Registrations_Services[0].Name" ... />
....
<input name="Registrations_Services[1].Id" ... />
<input name="Registrations_Services[1].Name" ... />
etc(即前缀为Viewdata
键),所以POST方法需要包含一个与ViewData
键同名的参数才能正确绑定
IEnumerable<Services> Registrations_Services
话虽如此,您正在编辑数据,因此您应该始终使用视图模型,而不是视图中的数据模型,视图模型将包含一个IEnumerable<Services> Services
属性,使您不必使用 ViewData
。