2010-01-23 74 views
16

我想知道是否有可能在ASP.NET MVC 2中创建一个自定义强类型的HTML帮助器?创建一个常规(读取不强类型)助手很简单,但我很难创建强类型的版本。例如,我想创建一个DatePickerFor html帮手...是否可以创建一个自定义的ASP.NET MVC强类型的HTML Helper?

任何指导或片段将不胜感激, 预先感谢您! JP

回答

14

好吧,我想通了(这是非常简单的...)。张贴我的重载之一,以防其他人遇到此问题。

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你是如何得到价值的?例如html.DatePicker(x => x.Date),你如何得到x.Date值 – Omu 2011-01-10 08:29:46

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

我用ModelMetadata如果创建日期选择器日期时间模板,这也将工作。

+0

这是否说明'html.DatePickerFor(m => m.User.Birthday)'? (多级别的解引用?)它看起来像'.PropertyName'成员只会返回最近的名称,不应该使用所有的级别? – 2012-12-20 21:16:46

4

我刚刚尝试了以下内容来创建一个强类型的CKEditor帮助程序,它似乎是完美无缺的工作。这假定你已经在你的项目中包含了jquery和必要的ckeditor脚本。查看ckeditor配置也可能很好,但是这满足了我目前的需求。

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