联系ModelMetadata的一个model属性

时间:2011-11-17 14:15:42

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

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

  

ASP.NET MVC 2模板,第2部分:ModelMetadata

     

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

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

我的问题是我如何与每个模型属性的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;
}

但对我模型的每个属性执行此操作都非常冗长,不是吗?

1 个答案:

答案 0 :(得分: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" />