gpt4 book ai didi

c# - 在父类(super class)局部 View 中使用子类 UI 提示

转载 作者:太空宇宙 更新时间:2023-11-03 10:21:15 25 4
gpt4 key购买 nike

所以我得到了一个部分 View ,该 View 显示了一个模型,其中包含组织中某个人的一些信息。其中一个属性是一个标题列表,其中有一个 UIHint 属性来确定要使用的显示模板。假设模型看起来像这样:

public class Info
{
[UIHint("Titles")]
[DataType("Titles")]
public virtual IEnumerable<string> Titles { get; set; }
}

假设 Info 的模板如下所示:

@model Info
@Html.DisplayFor(x=> x.Titles)

现在我们有一个非常特定类型的 person-at-org 实例,我们想使用相同的模板显示它,但我们想为 Titles 属性使用不同的显示模板,所以我们创建一个 Info 模型的子类:

public class SpecificInfo : Info
{
[UIHint("SpecificTitles")]
[DataType("SpecificTitles")]
public override IEnumerable<string> Titles { get; set; }
}

但它仍在尝试使用“Titles”显示模板,大概是因为传递给 DisplayFor 帮助程序的表达式认为它正在访问 Info 类的属性。

有什么方法可以让助手使用正确的显示模板吗?我一直在想一个可能的解决方案是创建我自己的 DisplayFor 扩展方法来确定模型的运行时类型是什么并使用反射来查找属性并检查我们是否在那里指定模板但我可以不要动摇可能有更简单的方法来做到这一点的感觉。

最佳答案

你是对的设置@model Info在你看来是DisplayeFor使用 htmlHelper<Info> .它只能访问 Info属性。您可以在 View 中指定要使用的模板:

@Html.DisplayFor(x=> x.Titles, Model is SpecificInfo ? "SpecificInfo" : "Info")

但是没有理由UIHintAttribute .

在编写时,您还可以编写自定义 DisplayFor 方法,并且可以使用 htmlHelper.ViewData.Model获取实际的模型属性(如您在评论中所建议的那样;)):

    public static MvcHtmlString CustomDisplayFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression)
{
MemberExpression memberExpression = (MemberExpression)expression.Body;
var propertyName = memberExpression.Member is PropertyInfo ? memberExpression.Member.Name : (string)null;
var prop = htmlHelper.ViewData.Model.GetType().GetProperty(propertyName);
var customAttributeData = prop.GetCustomAttributesData().FirstOrDefault(a => a.AttributeType.Name == "UIHintAttribute");

if (customAttributeData != null)
{
var templateName = customAttributeData.ConstructorArguments.First().Value as string;
return DisplayExtensions.DisplayFor<TModel, TValue>(htmlHelper, expression, templateName);
}
return DisplayExtensions.DisplayFor<TModel, TValue>(htmlHelper, expression);
}

查看:

@Html.CustomDisplayFor(x => x.Titles)

关于c# - 在父类(super class)局部 View 中使用子类 UI 提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33424780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com