2010-07-20 72 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