2011-12-21 2 views
1

Я программирую с использованием ASP.NET MVC 3 с движком просмотра Razor. Вот что я хотел бы быть в состоянии сделать:Как я могу использовать метод модели в пользовательском HtmlHelper

@Html.DisplayWithLabel(model => model.DisplayEventDate(), "When", "") 

DisplayWithLabel обычай HTML помощник, который показывает что-то с этикеткой.

Вот его подпись (или по крайней мере то, что я думаю, что это должно выглядеть):

public static MvcHtmlString DisplayWithLabel<TModel>(this HtmlHelper<TModel> html, Expression<Func<TModel, Func<MvcHtmlString>>> expression, string label, string cssClass) 

Почему я использую свою модель, как это? Ну, я бы хотел иметь методы расширения для моей модели, которые помогут мне форматировать свои данные, когда это необходимо (вместо форматирования данных внутри самой модели). Например, для форматирования даты событий у меня есть этот метод расширения:

public static MvcHtmlString DisplayEventDate(this MyEntity entity) 
{ 
    return new MvcHtmlString(string.Format("{0}@{1}", string.Format("{0:D}", entity.EventDate), 
          string.Format("{0:t}", entity.EventDate))); 
} 

Но когда я пытаюсь просмотреть мнение я получаю ошибку о том, что это не возможно неявное преобразование из MvcHtmlString в Func<MvcHtmlString>.

Я пытался понять это сам, но я не мог найти ключ так, пожалуйста, помогите мне :)

ответ

1

Вы должны быть в состоянии сделать что-то вроде этого:

public static MvcHtmlString MyMethodName<TModel, TValue>(
    this HtmlHelper<TModel> html, 
    Expression<Func<TModel, TValue>> expression, 
    string myText) { 
    var exprValue = ModelMetadata.FromLambdaExpression(expression, 
         htmlHelper.ViewData).Model; 

    var builder = new TagBuilder("label"); 
    builder.SetInnerText(myText + " " + exprValue.ToString()); 
    return MvcHtmlString.Create(builder.ToString()); 

} 
+0

Ну ты прав:), но в этом конкретном случае я хотел бы использовать MvcHtmlString явно вместо TValue – Beatles1692

+0

Я не уверен, что понимаю. Вы можете передать любой тип через TValue – isNaN1247