是否可以创建自定义 ASP.NET MVC 强类型 HTML Helper?

Posted

技术标签:

【中文标题】是否可以创建自定义 ASP.NET MVC 强类型 HTML Helper?【英文标题】:Is it possible to create a custom ASP.NET MVC strongly typed HTML Helper? 【发布时间】:2010-01-23 06:49:54 【问题描述】:

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

任何指导或 sn-ps 将不胜感激, 先感谢您! JP

【问题讨论】:

【参考方案1】:

好的,我想通了(这很简单......)。发布我的一个超载,以防其他人遇到这个问题。

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

【讨论】:

@JP 你如何获得价值?例如html.DatePicker(x => x.Date),怎么得到x.Date值【参考方案2】:

我刚刚尝试了以下方法来创建一个强类型的 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);
    

【讨论】:

【参考方案3】:
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,如果您为 datepicker 创建一个日期时间模板,这也将起作用。

【讨论】:

此帐户是否为html.DatePickerFor(m =&gt; m.User.Birthday)? (多级取消引用?)看起来.PropertyName 成员只会返回最近的名称,它不应该使用所有级别吗?

以上是关于是否可以创建自定义 ASP.NET MVC 强类型 HTML Helper?的主要内容,如果未能解决你的问题,请参考以下文章

asp.net mvc 视图和强类型视图数据

Asp.Net Mvc的几个小问题

在 Asp.Net MVC 中验证自定义用户类

asp.net mvc 自定义全局过滤器 验证用户是否登录

ASP.NET MVC 强类型视图与否?

将自定义属性添加到 asp.net-mvc 中的页面指令