c# - UIHint 不使用 EditorTemplate

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

但是,无论如何,它都不会呈现慈善机构模板。我一直在为此绞尽脑汁,它应该有效……但事实并非如此。

有什么想法吗?

编辑:

问题是默认的对象模板不会渲染除自身之外的复杂对象(所谓的浅潜水),即使有 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/

相关文章:

javascript - ASP.NET MVC RAZOR ActionLink 点击

javascript - 无法查看可观察对象上的数据

asp.net - ASP.NET MVC 路由的无限 URL 参数

asp.net - MVC 3 搜索路径

javascript - 与背景图片一起定位时链接不起作用?

asp.net-mvc - 如何将现有的 asp.net MVC 应用程序与 IdentityServer 集成?

asp.net-mvc-3 - MVC3 JQuery AJAX ||多个传递的参数为空

c# - 当我将一个类声明为内部类时,为什么 IL 将其显示为私有(private)类?

c# - 关于重写规则的混淆 C#

c# - 使用 msbuildworkspace 打开解决方案会给出没有详细信息的诊断错误