Как сделать собственный строго типизированный вспомогательный метод HTML? - PullRequest
3 голосов
/ 03 декабря 2010

Теперь я узнал, как создавать собственные html-помощники

using System;
namespace MvcApplication.Helpers {
  public class InputlHelper {
    public static string Input(this HtmlHelper helper, string name, string text) {
       return String.Format("<input name='{0}'>{1}</input>", name, text);
    }
  }
}

Теперь, как превратить его в строго типизированный вспомогательный метод InputFor Как это происходит в фреймворке?мне не нужен метод Html.TextBoxFor, я знаю, что он существует.Мне просто любопытно, как реализовать это поведение самостоятельно, и я использовал это в качестве простого примера.

PS.Я искал в исходном коде mvc, но не смог найти следов этого загадочного TextBoxFor.Я нашел только TextBox.Я смотрю на неправильный код ?

1 Ответ

4 голосов
/ 03 декабря 2010

Здесь вы можете найти ASP.NET MVC 2 RTM Исходный код .

Если вы посмотрите на класс InputExtensions внутри пространства имен System.Web.Mvc.Html, вы найдете следующий код

[SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Justification = "This is an appropriate nesting of generic types")]
public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) {
    return htmlHelper.TextBoxFor(expression, (IDictionary<string, object>)null);
}

[SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Justification = "This is an appropriate nesting of generic types")]
public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes) {
    return htmlHelper.TextBoxFor(expression, new RouteValueDictionary(htmlAttributes));
}

[SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Justification = "This is an appropriate nesting of generic types")]
public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes) {
    return TextBoxHelper(htmlHelper,
                            ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).Model,
                            ExpressionHelper.GetExpressionText(expression),
                            htmlAttributes);
}
...