1

我有一个视图模型:

public class AttributeEditorViewModel
{
    public long AttributeId { get; set; }
    public string DisplayName { get; set; }
    public object Value { get; set; }
}

该模型是使用模型构建器构建的,因此最终视图模型具有上述对象的列表:

public class AttributeListViewModel
{
    public List<AttributeEditorViewModel> Attributes { get; set; }
}

我的模型构建器编译了一个 AttributeEditorViewModel 对象列表,并将适当的原始类型设置为 Value 属性。数据类型来自属性的单独定义。

现在 Razor 视图(可以说是 edit.cshtml)看起来像:

@model AttributeListViewModel

@Html.EditorFor(m => m.Attributes)

和编辑器模板 Views/Shared/EditorTemplates/AttributeEditorViewModel.cshtml:

@model AttributeEditorViewModel

<div>
    <label>@Model.DisplayName</label>
    @Html.EditorFor(m => m.Value)
    @Html.ValidationMessageFor(m => m.Value)
</div>

我的期望;如果我将 AttributeEditorViewModel 的 Value 属性设置为双精度,如下所示:

public ActionResult Edit()
{
    return View(new AttributeListViewModel 
    {
        Attributes = new List<AttributeEditorViewModel> 
        {
            new AttributeEditorViewModel { DisplayName = "Double example", Value = (double) 0 }
        }
    };
}

我希望会呈现一个文本框。相反,它什么也不渲染。我添加了另一个编辑器模板 Views/Shared/EditorTemplates/Double.cshtml:

@model double

@Html.TextBoxFor(m => m)

这解决了眼前的问题。所以现在我得到一个值为 0 的文本框。然而,即使在自定义编辑器模板中使用 EditorFor 也不会呈现任何内容。

使用对象作为基本类型是根本错误的吗?为什么在使用 EditorFor 或 EditorForModel 时什么都不渲染?

任何见解表示赞赏。

4

3 回答 3

1

这是因为 EditorFor 使用泛型参数上的编译时绑定来确定要呈现哪个模板。

而且由于默认情况下没有EditorFor<object>()定义,因此您什么也得不到。

我相信您可以根据需要为对象定义自己的编辑器模板,但可能更好的方法是使您的视图模型通用:

public class AttributeEditorViewModel<TValue>
{
    public long AttributeId { get; set; }
    public string DisplayName { get; set; }
    public TValue Value { get; set; }
}

但是,这可能并不理想,因为您不再拥有多态视图模型的列表。

于 2012-12-10T17:39:48.133 回答
1

对象和编辑器的问题正是您想要它做什么,想象它包含一个包含 2,000,000 个 DataTables 的字典,每个 DataTables 包含 300 列和 20,000 行。它应该准确显示什么?在模型上使用 object 类型的属性本质上没有任何问题,只是不要指望 Razor 会根据你在对象中粘贴的内容神奇地知道它应该显示哪种编辑器。

于 2012-12-10T17:42:31.523 回答
1

实际问题在于您的 Razor 视图代码。当你这样做时:

@Html.EditorFor(m => m.Attributes)

您是在告诉视图引擎查找not forEditFor的模板。所以它使用默认的.List<AttributeEditorViewModel> AttributeEditorViewModelObjectTemplate

[edit.chtml]尝试类似:

@model AttributeListViewModel

@foreach (var att in Model.Attributes)
{
  @Html.EditorFor(m => att)
}

我不认为这个确切的答案会起作用(我不在一台有 VS atm 的机器上),但它可以让你理解你遇到的问题。

于 2012-12-10T18:00:41.033 回答