2012-02-19 10 views
6

Jeśli działanie Get zwraca widok z modelem "samochodu". Widok wyświetla informacje z obiektu i pobiera dane wejściowe do wysłania w formularzu do innej akcji, która pobiera obiekt typu "Płatność"Zdecydowana pomocnik html z innym modelem dla uzyskania i wysłania

Model na widoku jest typu Car i daje mi silną obsługę HTML i kilka innych funkcji jak displaytext. Ale do wysyłania postów nie mam wsparcia Htmlhelper jak TextBox (x => x.amount potrzebuję zrobić to jak @ Html.TextBox ("Ilość" ... Jest to możliwe, ale czy jest to jedyna opcja?

Odpowiedz

9

można to zrobić:

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

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

z tej metody rozszerzenie:

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

Jeśli rozumiem Twojego problemu poprawnie, spróbuj:

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

Można również utworzyć szablon edytora dla płatności. Szczegółowe informacje na ten temat można znaleźć w sekcji this page.

Jeśli się nie mylę, może pomóc przykładowy kod.

4

Jeśli dobrze rozumiem twoje pytanie, oto jakiś kod, który właśnie napisałem dla jednego z moich projektów, aby zrobić coś podobnego. Nie wymaga niczego specjalnego, jak sugerował Max Toro.

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

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

Najczystsze rozwiązanie. Działa jak marzenie. –

1

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

Uratowałeś mi życie !!! –

Powiązane problemy