Как я могу использовать вспомогательный метод HTML в методе расширения? - PullRequest
4 голосов
/ 18 ноября 2011

У меня есть следующие классы:

public class Note
{
    public string Text { get; set; }
    public RowInfo RowInfo { get; set; }
}

public class RowInfo
{
    [DisplayName("Created")]
    public DateTime Created { get; set; }
    [DisplayName("Modified")]
    public DateTime Modified { get; set; }
}

На мой взгляд, у меня есть следующее, которое создает HTML с правильным именем и значением:

Html.HiddenFor(model => model.Note.Created)

Теперь я пытаюсь создать метод расширения, который будет включать в себя все вышеперечисленное и который я буду вызывать в каждом представлении. Я пытался сделать следующее. Я думаю, что я на правильном пути, но я не знаю, как сделать эквивалент "model => model.Note.Created". Может кто-нибудь дать мне несколько советов о том, как я могу это сделать, и что мне нужно заменить текст в скобках на , У меня нет модели, но я могу сделать это другим способом, чтобы скрытое поле посмотрело на мой класс, чтобы получить правильное DisplayName, как это было выше?

 namespace ST.WebUx.Helpers.Html
   {
    using System.Web.Mvc;
    using System.Web.Mvc.Html
    using System.Linq;

public static class StatusExtensions
{
    public static MvcHtmlString StatusBox(this HtmlHelper helper, RowInfo RowInfo )
    {
        return new MvcHtmlString( 
           "Some things here ... " +
           System.Web.Mvc.Html.InputExtensions.Hidden( for created field ) +
           System.Web.Mvc.Html.InputExtensions.Hidden( for modified field ) );
    }

}

1 Ответ

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

Вы можете написать строго типизированный помощник с λ-выражением:

public static class StatusExtensions
{
    public static IHtmlString StatusBox<TModel, TProperty>(
        this HtmlHelper<TModel> helper, 
        Expression<Func<TModel, TProperty>> ex
    )
    {
        return new HtmlString(
           "Some things here ... " +
           helper.HiddenFor(ex));
    }
}

и затем:

@Html.StatusBox(model => model.RowInfo.Created)

ОБНОВЛЕНИЕ:

По запросуВ разделе комментариев приведена пересмотренная версия помощника:

public static class StatusExtensions
{
    public static IHtmlString StatusBox<TModel>(
        this HtmlHelper<TModel> helper,
        Expression<Func<TModel, RowInfo>> ex
    )
    {
        var createdEx = 
            Expression.Lambda<Func<TModel, DateTime>>(
                Expression.Property(ex.Body, "Created"), 
                ex.Parameters
            );
        var modifiedEx =
            Expression.Lambda<Func<TModel, DateTime>>(
                Expression.Property(ex.Body, "Modified"),
                ex.Parameters
            );

        return new HtmlString(
            "Some things here ..." + 
            helper.HiddenFor(createdEx) + 
            helper.HiddenFor(modifiedEx)
        );
    }
}

, а затем:

@Html.StatusBox(model => model.RowInfo)

Нет необходимости говорить, что для создания небольших фрагментов HTML должны использоваться пользовательские помощники HTML.Сложность может быстро возрасти, и в этом случае я бы рекомендовал использовать шаблон редактора для типа RowInfo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...