2010-01-23 33 views
16

Me preguntaba si es posible crear un HTML Helper personalizado fuertemente tipado en ASP.NET MVC 2? Crear una ayuda regular (leer no fuertemente tipado) es sencillo, pero tengo dificultades para crear versiones fuertemente tipadas. Por ejemplo, me gustaría crear un DatePickerFor html helper ...¿Es posible crear un ASP.NET MVC personalizado fuertemente HTML Helper?

Cualquier guía o fragmento sería muy apreciado, ¡Gracias de antemano! JP

Respuesta

14

Ok, me di cuenta (y fue bastante sencillo ...). Publicando una de mis sobrecargas en caso de que alguien más se encuentre con esta pregunta.

public static string DatePickerFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper,Expression<Func<TModel, TProperty>> expression) 
    where TModel : class 
{ 
    var inputName = ExpressionHelper.GetExpressionText(expression); 
    return htmlHelper.DatePicker(inputName); 
} 
+2

@JP ¿cómo se obtiene el valor? p.ej. html.DatePicker (x => x.Date), ¿cómo se obtiene x.Valor de fecha – Omu

1
public static string DatePickerFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper,Expression<Func<TModel, TProperty>> expression) 
    where TModel : class 
{ 
    ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 
    return htmlHelper.DatePicker(metadata.PropertyName); 
} 

que utilizan ModelMetadata esto también funcionará si se crea una plantilla de fecha y hora para el selector de fechas.

+0

¿Esto cuenta para 'html.DatePickerFor (m => m.User.Birthday)'? (¿Múltiples niveles de desreferenciación?) Parece que el miembro '.PropertyName' simplemente devolverá el nombre más reciente, y ¿no debería usar todos los niveles? –

4

Acabo de probar lo siguiente para crear un ayudante CKEditor fuertemente tipado y parece funcionar sin problemas. Esto supone que ya ha incluido jquery y los scripts necesarios de ckeditor en su proyecto. También podría ser bueno ver configurar también la configuración de ckeditor, pero esto satisfizo mis necesidades actuales.

public static MvcHtmlString CkEditor(this HtmlHelper htmlHelper, string name, string value, object htmlAttributes) 
    { 
     var output = htmlHelper.TextArea(name, value, htmlAttributes).ToString(); 
     output += string.Format("<script type=\"text/javascript\">$(document).ready(function(){{ $('#{0}').ckeditor(); }});</script>", name); 

     return MvcHtmlString.Create(output); 
    } 

    public static MvcHtmlString CkEditor(this HtmlHelper htmlHelper, string name, string value) 
    { 
     return htmlHelper.CkEditor(name, value, null); 
    } 

    public static MvcHtmlString CkEditorFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes) where TModel : class 
    { 
     ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 
     return htmlHelper.CkEditor(metadata.PropertyName, metadata.Model as string, htmlAttributes); 
    } 

    public static MvcHtmlString CkEditorFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) where TModel : class 
    { 
     return htmlHelper.CkEditorFor(expression, null); 
    } 
Cuestiones relacionadas