2

我有一个这样的模型:

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()

但是,无论如何,它都不会呈现 Charities 模板。我一直在为此绞尽脑汁,它应该可以工作..但事实并非如此。

有任何想法吗?

编辑:

问题是默认的对象模板不会渲染除自身以外的复杂对象(所谓的浅潜),即使有 UIHint。我的印象是 UIHint 会使它呈现模板,但我显然错了。

解决方法是不要尝试让模型自己渲染。那是可悲的。

4

1 回答 1

5

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

现在说到重点:你已经CharitiesUIHint. 此属性的类型为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编辑器模板。

于 2011-08-29T19:22:04.370 回答