Есть ли способ обернуть методы Html.CheckboxFor, Html.TextboxFor и т. Д. Пользовательской логикой? - PullRequest
1 голос
/ 09 июня 2011

Я работаю с устаревшими моделями, которые объединяют данные и метаданные в одно свойство.Для целей этого вопроса предположим, что интерфейс:

pubic interface ILegacyCheckbox 
{
   bool Value { get; set; }
   bool Editable { get; set; }
}

Я хочу обернуть метод расширения CheckBoxFor () своим собственным,

public static MvcHtmlString LegacyCheckboxFor<TModel>(
    this HtmlHelper<TModel> html, 
    Expression<Func<TModel, ILegacyCheckbox>> expression)
{
    // wrap html.CheckBoxFor() method here by extracting the Value  
    // property and check if Editable is false, in which case add 
    // an htmlAttribute of "disabled=true"
}

Есть ли способ сделатьчто-то вроде этого?С чего бы начать?

Буду признателен за любую помощь,

Спасибо,
Алекс

Ответы [ 2 ]

1 голос
/ 09 июня 2011

Вы можете попробовать что-то вроде этого:

public static MvcHtmlString LegacyCheckboxFor<TModel>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, ILegacyCheckbox>> expression)
{
    var parameterName = ((MemberExpression)expression.Body).Member.Name;
    var compiled = expression.Compile().Invoke(html.ViewData.Model);

    if (editable)
        return html.CheckBox(parameterName, compiled.Value);
    else
        return html.CheckBox(parameterName, compiled.Value, new {disabled = "disabled"});
}

Вы также можете кэшировать скомпилированное выражение.

В моем примере используется Html.CheckBox ();Я не уверен, как использовать CheckBoxFor ().У меня тоже нет времени, чтобы расследовать это, но, по крайней мере, это где-то начать.

0 голосов
/ 09 июня 2011
public static MvcHtmlString LegacyCheckboxFor<TModel>(
    this HtmlHelper<TModel> html,
    Expression<Func<TModel, ILegacyCheckbox>> expression)
{
    MemberExpression memberExpression = expression.Body as MemberExpression;
    string parameterName = memberExpression.Member.Name;

    var checkbox = expression.Compile().Invoke(html.ViewData.Model);

    return new MvcHtmlString(
        string.Format(
        "<input type=\"checkbox\" name=\"{0}\" id=\"{0}\" value=\"{1}\" {2} />",
            parameterName,
            checkbox.Value,
            checkbox.Editable ? "disabled=true" : string.Empty));
}
...