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

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

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

【问题讨论】:

    标签: c# .net asp.net asp.net-mvc html-helper


    【解决方案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 成员只会返回最近的名称,它不应该使用所有级别吗?
      猜你喜欢
      • 2017-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 2017-10-08
      • 2016-09-27
      • 2010-09-28
      相关资源
      最近更新 更多