2012-12-21 12 views
7

chcę mieć niestandardową Html.DateTimePickerFor(a => a.Fields[0].Id, value)Jak napisać niestandardowy ASP.NET MVC HTML Helper jak Html.TextBoxFor i ustawić atrybut poprawna nazwa

więc wynik powinien być tak:

<div name="Fields[0].Id"></div> 

Obecnie używam Html.DatetimePicker("Fields[0].Id", value) i działa idealnie, ale chcę wygenerować nazwę dynamiczną.

Pytanie brzmi, jak ustawić prawidłowy atrybut "name"?

+0

na ciebie starając się stworzyć wersję 'TextBoxFor' dla pól DateTime lub' szablon EditFor' dla konkretnej dziedzinie? Myślę, że jest to obecnie najważniejszy czynnik. –

Odpowiedz

4

Spróbuj tego. Mi to pasuje.

public static MvcHtmlString DateTimePickerFor<TModel, TProp>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProp>> expression, object htmlAttributes) 
    { 
     string name = ExpressionHelper.GetExpressionText(expression); 
     ... rest of code here 
    } 

Magia pochodzi z System.Web.Mvc.ExpressionHelper.GetExpressionText(). Po uzyskaniu nazwy od wyrażenia możesz zastosować ją do swojego div.

GetExpressionText()

+0

Uważaj przy tej metodzie, ponieważ pomija 2 rzeczy, które 'NameFor()' robi: 1) kodowanie atrybutów i 2) kwalifikację nazwy. Zobacz źródło MVC, gdzie nazwa jest dodatkowo kwalifikowana przez wywołanie: 'html.ViewData.TemplateInfo.GetFullHtmlFieldName (name)' –

+0

Cool! Dokładnie to, czego chciałem. – Sergey

+0

@TimMedora - do jakiej wersji tego służy mvc? Widzę to w obecnej wersji źródła, ale w aplikacji MVC3, z której wyciągnąłem swój fragment, nie widzę tej metody. Czy to tylko MVC4? Jeśli masz aplikację MVC4, twoje rozwiązanie brzmi jak lepsza droga. – hawkke

2

Spróbuj coś takiego (na podstawie kodeksu pracy):

public static IHtmlString DateTimePickerFor<TModel, TValue>(
    this HtmlHelper<TModel> helper, 
    Expression<Func<TModel, TValue>> expression, 

    // other input parameters as needed 

) { 
    // metadata gives you access to a variety of useful things, such as the 
    // display name and required status 
    var metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData); 
    string markup = ""; // markup for your input    

    var name = helper.NameFor(expression); // getting the name 

    return MvcHtmlString.Create(markup ); 
} 
Powiązane problemy