Обратитесь к ModelMetadata одного из свойств модели - PullRequest
3 голосов
/ 17 ноября 2011

Я читал одну из статей Брэда Уилсона:

Шаблоны 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 собственности. Не имеет быть таким.

EDIT

Я нашел другой похожий вопрос:

ModelMetadata для сложного типа в редакторе шаблонов в asp.net mvc

и ответ таков:

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

Но это довольно многословно делать это для каждого свойства моей модели, не так ли?

1 Ответ

4 голосов
/ 17 ноября 2011

Менее многословно создать 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" /> 
...