Преобразование EditorTemplate в HtmlHelper - PullRequest
0 голосов
/ 08 февраля 2012

Первоначально я создал шаблон редактора, подобный этому

@model MyModel
var items = // get items
@Html.DropDownListFor(m => m.Id, items, new { id = Html.IdFor(m => m) })

, который был вызван

@Html.EditorFor(m => m.SomeClass)

, где SomeClass имеет свойство Id.(IdFor - один из моих помощников по HTML).

Это сгенерирует что-то вроде этого

<select name="SomeClass.Id" id="SomeClass" />

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

@Html.CustomEditorFor(m => m.SomeClass)

Я изменяю это с представления на помощник, потому что его проще для повторного использования.

Это примерно то, что у меня есть:

public static MvcHtmlString CustomEditorFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
    var idString = htmlHelper.IdFor(expression);
    var propertyValue = expression.Compile()(htmlHelper.ViewData.Model);
    var items = // get items
    return htmlHelper.DropDownListFor(expression, items, new {id = idString});
}

Однако, когда я вызываю редактор, я получаю этот HTML вместо того, что я хочу.

<select name="SomeClass" id="SomeClass" />

Как я могу изменить выражение настолько, чтобы оно могло "обращаться" к свойству Id?

1 Ответ

1 голос
/ 08 февраля 2012

Попробуйте это:

public static MvcHtmlString CustomEditorFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
    var idString = htmlHelper.IdFor(expression);
    var items = // get items

    var param = Expression.Parameter(typeof(TModel), "m");
    var member = Expression.Property(
                     Expression.Property(param, ExpressionHelper.GetExpressionText(expression))
                 , "Id");

    var isNullable = Nullable.GetUnderlyingType(member.Type);
    if (isNullable != null) {
        var expr2 = Expression.Lambda<Func<TModel, int?>>(
                        member, new[] { param }
                    );

        return htmlHelper.DropDownListFor(expr2, items, new { id = idString });
    }

    var expr = Expression.Lambda<Func<TModel, int>>(
                   member, new[] { param }
               );

    return htmlHelper.DropDownListFor(expr, items, new { id = idString });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...