Что это за тип данных в вспомогательных методах MVC3 html? - PullRequest
0 голосов
/ 14 марта 2012

Я пытаюсь создать свой собственный вспомогательный метод HTML с этим синтаксисом:

@Html.BootstrapLabelFor(m => Model.Email) //Email is a simple string property.

Вот что у меня есть:

public static MvcHtmlString BootstrapLabelFor<TModel, TValue>
(this HtmlHelper<TModel> htmlHelper, 
    Expression<Func<TModel, TValue>> expression)
{
    string html = String.Format("<label for='{0}' class='some-class' />",
        expression.Email.DisplayName???? - NEED HELP HERE. );
    return new MvcHtmlString(html);
}

Так вот суть этого.

Что мне нужно знать, так это как извлечь свойство DisplayName (если оно так называется) из объекта выражения. Предполагая, что это то, где мне нужно искать.

Вот мой класс LogOnModel:

public class LogOnModel
{
    [Required(ErrorMessage = "You must enter your email address.")]
    [Display(Name = "Email:")]
    public string Email { get; set; }

    [Required(ErrorMessage = "You must enter your password.")]
    [DataType(DataType.Password)]
    [Display(Name = "Password:")]
    public string Password { get; set; }

    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }
}

Теперь мы куда-то добираемся. Вот что у меня сейчас. Он выводит правильное свойство с тем, что я хочу, но не использует декоратор метаданных DisplayName, который я использовал в модели. Только выплевывая имя свойства. Есть предложения?

public static MvcHtmlString BootstrapLabelFor<TModel, TValue>
    (this HtmlHelper<TModel> htmlHelper, 
        Expression<Func<TModel, TValue>> expression)
{
    string html = String.Format(
        "<label for='{0}' class='control-label'>{0}</label>",
        ExpressionHelper.GetExpressionText(expression));
    return new MvcHtmlString(html);
}

1 Ответ

1 голос
/ 14 марта 2012

Посмотрите на исходный код ASP.Net MVC 3 и скопируйте то, что они делают, и в итоге вы получите что-то вроде этого:

public static MvcHtmlString BootstrapLabelFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper,
                                                            Expression<Func<TModel, TValue>> expression)
{
    var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
    var htmlFieldName = ExpressionHelper.GetExpressionText(expression);
    var resolvedLabelText = metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last();
    if (String.IsNullOrEmpty(resolvedLabelText))
    {
        return MvcHtmlString.Empty;
    }

    TagBuilder tag = new TagBuilder("label");
    tag.Attributes.Add("for", TagBuilder.CreateSanitizedId(htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName)));
    tag.Attributes.Add("class", "control-label");
    tag.SetInnerText(resolvedLabelText);
    return new MvcHtmlString(tag.ToString(TagRenderMode.Normal));
}

К сожалению, встроенные вспомогательные методы для Labels не принимают htmlAttributes, поэтому вы не можете легко использовать их код для этого.

...