【问题标题】:UIHint not using EditorTemplateUIHint 不使用 EditorTemplate
【发布时间】:2011-08-29 18:15:45
【问题描述】:

我有一个这样的模型:

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 会让它呈现模板,但我显然错了。

解决方法是不要尝试让模型自己渲染。好难过。

【问题讨论】:

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


    【解决方案1】:

    首先在您的页面中@EditoFormodel() 看起来很奇怪。我猜你的意思是别的。

    现在重点:您已经用UIHint 装饰了Charities 属性。此属性的类型为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 编辑器模板。

    【讨论】:

    • 不,我没有 MyModel.cshtml。我正在使用默认的对象模板来呈现它。我已经纠正了我对 EditorForModel 的错误输入。我还尝试将 Charities.cshtml 强输入到 SelectList 中,但也没有呈现。我认为如果模型类型错误,它会简单地抛出。但它甚至没有选择 Charities.cshtml 来渲染。
    • @Mystere Man,正如我所说,您的代码的问题是您在 Charities 属性上指定了一个 UIHint 属性,该属性是 SelectList 类型,而您的 Charities.cshtml 强类型为 MyModel,这是不一致的.此外,如果您希望将 Charities.cshtml 视图模型强烈键入到 SelectList 以进行渲染,则应使用 Html.EditorFor(x => x.Charities)
    • 如果是这种情况,它应该抛出,而不是渲染失败。无论如何,我尝试将它强输入到 SelectList 中,但它仍然没有尝试渲染,通过在视图中设置断点进行验证。就好像它完全忽略了 UIHint,或者某些东西正在覆盖它。
    • @Mystere Man,您是否将@Html.EditorForModel() 替换为@Html.EditorFor(x => x.Charities)?如果它仍然没有呈现,我怀疑您将此 Charities.cshtml 文件放在了错误的文件夹中。
    • 我试图让模型自己渲染,如果可能的话。似乎默认的对象模板即使使用 UIHint 也不会渲染复杂的对象。
    猜你喜欢
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多