UIHint不使用EditorTemplate

Eri*_*sch 2 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; }
}
Run Code Online (Sandbox Code Playgroud)

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

@model MyModel

@Html.DropDownListFor(model => model.CharityId, Model.Charities)
Run Code Online (Sandbox Code Playgroud)

然后在我的页面中:

@model MyModel

@Html.EditorForModel()
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

编辑:

问题是,默认的对象模板将不会呈现比本身(所谓的小角度俯冲)等复杂的对象,即使是有UIHint.我的印象是UIHint会让它渲染模板,但我显然是错的.

修复是不要试图让模型自己渲染.那很难过.

Dar*_*rov 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; }
}
Run Code Online (Sandbox Code Playgroud)

在你看来:

@model MyModel
@Html.EditorForModel()
Run Code Online (Sandbox Code Playgroud)

然后里面~/Views/Shared/EditorTemplates/MyModel.cshtml有:

@model MyModel
@Html.DropDownListFor(model => model.CharityId, Model.Charities)
Run Code Online (Sandbox Code Playgroud)

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

@model MyModel
@Html.EditorForModel("Charities")
Run Code Online (Sandbox Code Playgroud)

但通常你会有以下型号:

public class FooViewModel
{
    [UIHint("Charities")]
    public MyModel Charities { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果您的主视图是强类型的,FooViewModel您可以:

@model FooViewModel
@Html.EditorFor(x => x.Charities)
Run Code Online (Sandbox Code Playgroud)

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