3

我正在阅读 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 App 上,我有以下模型:

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

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

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

联系人.cshtml

@model MyApp.Models.Contact

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

注意: GetItsMetaData 方法是我完全编造的。我只是想获取该属性的 MedelMetadata。不一定要那样。

编辑

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

asp.net mvc中编辑器模板中复杂类型的模型元数据

答案是这样的:

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

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

4

1 回答 1

4

创建用于此目的的 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" /> 
于 2011-11-17T14:47:46.960 回答