2010-07-20 71 views
1

我想创建一个强类型的html助手扩展为日期选择器使用jquery ui datepicker。我创建了一个不强类型的扩展,它可以工作,但现在我试图创建它强类型。帮助在Asp.net MVC 2中创建强类型的html助手扩展

以下是我有:

public static MvcHtmlString DatePicker(this HtmlHelper html, string name, object date) 
    { 
     var inputTag = new TagBuilder("input"); 
     inputTag.MergeAttribute("id", name); 
     inputTag.MergeAttribute("name", name); 
     inputTag.MergeAttribute("type", "text"); 

     if (date != null) 
     { 
      string dateValue = String.Empty; 
      if ((date is DateTime? ||date is DateTime) && (DateTime)date != DateTime.MinValue) 
      { 
       dateValue = ((DateTime)date).ToShortDateString(); 
      } 
      else if (date is string) 
      { 
       dateValue = (string)date; 
      } 

      inputTag.MergeAttribute("value", dateValue); 
     } 

     return MvcHtmlString.Create(inputTag.ToString()); 
    } 

这工作,并会持续的价值。这是我的强类型扩展。

public static MvcHtmlString DatePickerFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) where TModel : class 
    { 
     Func<TModel, TProperty> myFunc = expression.Compile(); 
     var value = myFunc(???); 

     var inputName = ExpressionHelper.GetExpressionText(expression); 
     return htmlHelper.DatePicker(inputName, value); 
    } 

这工作,如果我传递null值(值= NULL),但编辑时,日期选择器不与值填充。

如何从模型中获取DatePickerFor扩展方法中的值。 (我知道我可以只传递由另一个参数的值,但我宁愿不要。另外,这是很有趣的)

感谢 凯文

--edit ------我有什么作为最终结果---------- 注意:这还没有完全测试,但似乎现在正在工作。

public static MvcHtmlString DatePicker(this HtmlHelper html, string name, object date) 
    { 
     var inputTag = new TagBuilder("input"); 
     inputTag.MergeAttribute("id", name); 
     inputTag.MergeAttribute("name", name); 
     inputTag.MergeAttribute("type", "text"); 
     inputTag.AddCssClass("jqueryDatePicker"); 

     if (date != null) 
     { 
      string dateValue = String.Empty; 
      if ((date is DateTime? ||date is DateTime) && (DateTime)date != DateTime.MinValue) 
      { 
       dateValue = ((DateTime)date).ToShortDateString(); 
      } 
      else if (date is string) 
      { 
       dateValue = (string)date; 
      } 

      inputTag.MergeAttribute("value", dateValue); 
     } 

     return MvcHtmlString.Create(inputTag.ToString()); 
    } 

    public static MvcHtmlString DatePickerFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) where TModel : class 
    { 
     Func<TModel, TProperty> methodCall = expression.Compile(); 
     TProperty value = methodCall(htmlHelper.ViewData.Model); 
     var inputName = ExpressionHelper.GetExpressionText(expression); 

     return htmlHelper.DatePicker(inputName, value); 
    } 

这是使用JQuery UI datepicker脚本。什么是“jqueryDatePicker”,它为什么被添加为一个类?而不是调用$(#...)。datepicker()到每个页面,我添加这个类,并有一些JavaScript会找到这个类,并为你调用.datepicker()。

回答

0

类似下面应该工作:

var input = myFunc(htmlHelper.ViewData.Model) 
+0

是的,谢谢你这么多。我有它的工作。如果别人想用一点,我会发布我的。 – kheit 2010-07-20 19:32:06