我有一个这样的模型:
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()
但是,无论如何,它都不会呈现慈善机构模板。我一直在为此绞尽脑汁,它应该有效……但事实并非如此。
有什么想法吗?
编辑:
问题是默认的对象模板不会渲染除自身之外的复杂对象(所谓的浅潜水),即使有 UIHint。我的印象是 UIHint 会使其渲染模板,但我显然错了。
解决方法是不要尝试让模型自行渲染。真是可悲。
最佳答案
首先,页面中的 @EditoFormodel()
看起来很奇怪。我猜你的意思是别的。
现在重点是:您已使用 UIHint
装饰了 Charities
属性。该属性的类型为SelectList
。这意味着 Charities.cshtml
模板应该强类型化为 SelectList
,而不是像您那样强类型化为 MyModel
。您可以简单地删除此 UIHint 属性并拥有以下 View 模型:
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
编辑器模板。
关于c# - UIHint 不使用 EditorTemplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7234067/