Dodawanie do realizacji przez Maxa Toro, oto kilka bardziej, gdy masz niezerową modelu, ale nie mają informacji statycznych typu (te dwie metody muszą być osadzone w realizacji Max zapewnia).
Metody te działają dobrze, gdy masz dynamicznie pobierane nazwy właściwości dla modelu i trzeba wezwać nierodzajową HtmlHelper metod, które mają nazwę zamiast wyrażenia:
@Html.TextBox(propertyName)
na przykład.
public static HtmlHelper HtmlHelperFor(this HtmlHelper htmlHelper, object model)
{
return HtmlHelperFor(htmlHelper, model, null);
}
public static HtmlHelper HtmlHelperFor(this HtmlHelper htmlHelper, object model, string htmlFieldPrefix)
{
var t = model.GetType();
var viewDataContainer = CreateViewDataContainer(htmlHelper.ViewData, model);
TemplateInfo templateInfo = viewDataContainer.ViewData.TemplateInfo;
if(!String.IsNullOrEmpty(htmlFieldPrefix))
templateInfo.HtmlFieldPrefix = templateInfo.GetFullHtmlFieldName(htmlFieldPrefix);
ViewContext viewContext = htmlHelper.ViewContext;
ViewContext newViewContext = new ViewContext(viewContext.Controller.ControllerContext, viewContext.View, viewDataContainer.ViewData, viewContext.TempData, viewContext.Writer);
var gt = typeof(HtmlHelper<>).MakeGenericType(t);
return Activator.CreateInstance(gt, newViewContext, viewDataContainer, htmlHelper.RouteCollection) as HtmlHelper;
}
Najczystsze rozwiązanie. Działa jak marzenie. –