2012-02-19 4 views
6

Si Get Action devuelve una Vista con un modelo "Car". La vista muestra información del objeto y toma datos para publicar dentro de un formulario a otra acción que toma un objeto del tipo "Pago"Ayudante html Stronglytyped con un modelo diferente para get y post

El modelo en la vista es de tipo Car y me da soporte html fuertemente tipado y algunas otras características como displaytext. Pero para publicarlo no hay soporte Htmlhelper como TextBox (x => x.amount Necesito hacerlo como @ Html.TextBox ("Cantidad" ... Es posible, pero ¿es esta la única opción?

Respuesta

9

usted puede hacer esto:

@{ 
var paymentHtml = Html.HtmlHelperFor<Payment>(); 
} 

@paymentHtml.EditorFor(p => p.Amount) 

con este método de extensión:

public static class HtmlHelperFactoryExtensions { 

    public static HtmlHelper<TModel> HtmlHelperFor<TModel>(this HtmlHelper htmlHelper) { 
     return HtmlHelperFor(htmlHelper, default(TModel)); 
    } 

    public static HtmlHelper<TModel> HtmlHelperFor<TModel>(this HtmlHelper htmlHelper, TModel model) { 
     return HtmlHelperFor(htmlHelper, model, null); 
    } 

    public static HtmlHelper<TModel> HtmlHelperFor<TModel>(this HtmlHelper htmlHelper, TModel model, string htmlFieldPrefix) { 

     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); 

     return new HtmlHelper<TModel>(newViewContext, viewDataContainer, htmlHelper.RouteCollection); 
    } 

    static IViewDataContainer CreateViewDataContainer(ViewDataDictionary viewData, object model) { 

     var newViewData = new ViewDataDictionary(viewData) { 
     Model = model 
     }; 

     newViewData.TemplateInfo = new TemplateInfo { 
     HtmlFieldPrefix = newViewData.TemplateInfo.HtmlFieldPrefix 
     }; 

     return new ViewDataContainer { 
     ViewData = newViewData 
     }; 
    } 

    class ViewDataContainer : IViewDataContainer { 

     public ViewDataDictionary ViewData { get; set; } 
    } 
} 
0

Si entiendo su problema correctamente, intente:

@Html.EditorFor(x => x.Amount) 

También puede crear una plantilla de editor para el pago. Consulte this page para obtener detalles sobre cómo hacer esto.

Si no entiendo bien, algunos ejemplos de código pueden ayudar.

4

Si entiendo su pregunta correctamente, aquí hay un código que acabo de escribir para que uno de mis proyectos haga algo similar. No requiere nada especial, como lo sugirió Max Toro.

@{ 
    var teamHelper = new HtmlHelper<Team>(ViewContext, this); 
} 

@using (teamHelper.BeginForm()) 
{ 
    @teamHelper.LabelFor(p => p.Name) 
    @teamHelper.EditorFor(p => p.Name) 
} 
+1

Solución más limpia. Funciona de maravilla. –

1

Agregando a la aplicación por Max Toro, aquí hay un par más para cuando usted tiene un modelo no nulo, pero no tienen información de tipo estático (estos dos métodos tienen que ser embebido en la aplicación Max ofrece)

Estos métodos funcionan bien cuando se haya recuperado dinámicamente nombres de propiedades para un modelo y la necesidad de llamar a los métodos HtmlHelper no genéricos que tienen un nombre en lugar de una expresión:

@Html.TextBox(propertyName) 

por ejemplo.

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; 
    } 
+0

¡¡¡Salvaste mi vida !!! –