Как я могу использовать метод модели в пользовательском HtmlHelper - PullRequest
1 голос
/ 21 декабря 2011

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

@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 Ответ

1 голос
/ 21 декабря 2011

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

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

}
...