如何将 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