【问题标题】:Reach out to ModelMetadata of one of model property访问模型属性之一的 ModelMetadata
【发布时间】:2011-11-17 14:15:41
【问题描述】:

我正在阅读 Brad Wilson 的一篇文章:

ASP.NET MVC 2 模板,第 2 部分:模型元数据

http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-2-modelmetadata.html

假设在我的 ASP.NET MVC 3 应用程序中,我有以下模型:

public class Contact {
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

这是我的观点:

@model MyApp.Models.Contact

<h2>Contact</h2>

@Html.EditorForModel()

我在~/Views/Shared/EditorTemplates/ 路径中有一个Contact.cshtml 文件。

我的问题是如何联系每个模型属性的ModelMetadata。例如,如下所示:

Contact.cshtml

@model MyApp.Models.Contact

<input type="text" placeholder="@Model.FirstName.GetItsMetaData().Watermark" 
       value="@Model.FirstName" />

注意: GetItsMetaData 方法是我完全编造的。我只是想获取该属性的 MedelMetadata。没有 就这样吧。

编辑

我发现了另一个类似的问题:

ModelMetadata for complex type in editortemplate in asp.net mvc

答案是这样的:

@{
    var metadata = ModelMetadata
        .FromLambdaExpression<TestThing, string>(x => x.Test2, ViewData);
    var watermak = metadata.Watermark;
}

但是对我的模型的每个属性都这样做是相当冗长的,不是吗?

【问题讨论】:

  • 嗨 tugberk,我只是想回答您的问题“Entity Framework 4.2 上 Entry(entity) 和 Entry(entity) 之间的性能差异”但在在您删除问题的同时,大声笑。要点是:当您调用Entry(entity)(泛型类型推断)时,编译器 将选择泛型重载。无论您是否指定泛型参数,都会调用相同的方法。 (唯一的例外是如果entityobject 类型在编译时,则调用非泛型重载。)因为编译器调用相同的方法,所以没有性能差异。
  • @Slauma 是的,他们认为这个问题很愚蠢,我不想争论,所以我删除了它。非常感谢!

标签: asp.net-mvc asp.net-mvc-3 modelmetadata asp.net-mvc-templates


【解决方案1】:

创建用于此目的的 HtmlHelper 并不那么冗长。助手看起来像这样:

    public static string WatermarkFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
    {
        var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
        return metadata.Watermark;
    }

您将在示例中按如下方式使用它:

@model MyApp.Models.Contact  

<input type="text" placeholder="@Html.WatermarkFor(x => x.FirstName)"   
    value="@Model.FirstName" /> 

【讨论】:

  • 好方法!仍然需要做很多工作。这个FromLambdaExpression 方法在幕后使用反射,对吧?
  • 如果工作量太大,请改用这个:@Html.MagicallyGetWatermark() :)
  • @Dismissile 不能说它让我发痒。
  • 每当您访问属性的元数据时,都会涉及一些反射。但是,在这些情况下使用反射的实际成本非常小。
猜你喜欢
  • 1970-01-01
  • 2016-02-18
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
相关资源
最近更新 更多