UIHint不使用EditorTemplate

时间:2011-08-29 18:15:46

标签: c# asp.net-mvc asp.net-mvc-3 view-templates

我有一个这样的模型:

public class MyModel {
    [ScaffoldColumn(false)]
    public int CharityId { get; set; }

    [UIHint("Charities")]
    public SelectList Charities { get; set; }
}

然后我有一个名为Charities.cshtml的EditorTemplate:

@model MyModel

@Html.DropDownListFor(model => model.CharityId, Model.Charities)

然后在我的页面中:

@model MyModel

@Html.EditorForModel()

然而,无论如何,它都不会呈现慈善机构模板。我一直在抨击我的大脑,它应该有效......但事实并非如此。

有什么想法吗?

编辑:

问题是默认的Object模板不会渲染除自身之外的复杂对象(所谓的浅潜),即使有UIHint也是如此。我的印象是UIHint会让它渲染模板,但我显然是错的。

修复是不要试图让模型自我渲染。这很难过。

1 个答案:

答案 0 :(得分:5)

页面中的第一件事@EditoFormodel()看起来很奇怪。我想你的意思是别的。

现在要点:您已使用Charities修饰了UIHint属性。此属性的类型为SelectList。这意味着Charities.cshtml模板应该强烈输入SelectList,而不是MyModel。您只需删除此UIHint属性并具有以下视图模型:

public class MyModel {
    [ScaffoldColumn(false)]
    public int CharityId { get; set; }

    public SelectList Charities { get; set; }
}

并在您看来:

@model MyModel
@Html.EditorForModel()

然后在~/Views/Shared/EditorTemplates/MyModel.cshtml内有:

@model MyModel
@Html.DropDownListFor(model => model.CharityId, Model.Charities)

这是标准惯例。如果您希望调用您的编辑器模板Charities.cshtml,可以在页面中执行此操作:

@model MyModel
@Html.EditorForModel("Charities")

但通常你会有以下型号:

public class FooViewModel
{
    [UIHint("Charities")]
    public MyModel Charities { get; set; }
}

现在,如果主视图强烈输入FooViewModel,您可以:

@model FooViewModel
@Html.EditorFor(x => x.Charities)

将呈现Charities.cshtml编辑器模板。