2010-07-20 14 views
1

J'essaie de créer une extension d'aide html de type fortement pour un sélecteur de date en utilisant jquery ui datepicker. J'ai créé une extension qui n'est pas fortement typée, qui fonctionne mais maintenant j'essaye de la créer fortement typée.Aide pour la création d'une extension d'aide html fortement typée dans Asp.net MVC 2

Voici ce que j'ai:

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

Cela fonctionne et persistera la valeur. Voici ce que j'ai pour mon extension fortement typée.

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

Cela fonctionne si je passe null pour la valeur (valeur = null) mais lors de l'édition, le sélecteur de date n'est pas remplie avec une valeur.

Comment puis-je obtenir la valeur dans ma méthode d'extension DatePickerFor hors du modèle. (Je sais que je peux passer la valeur par un autre paramètre, mais je préfère ne pas. De plus c'est assez intéressant)

Merci Kevin

--edit ------ Ce que je comme résultat final ---------- Note: Ceci n'a pas été entièrement testé, mais semble fonctionner actuellement.

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

Ceci utilise le script datepicker de l'interface utilisateur JQuery. Qu'est-ce que "jqueryDatePicker" et pourquoi est-il ajouté en tant que classe? Au lieu d'appeler $ (# ...). Datepicker() à chaque page, j'ajoute cette classe et il y a du javascript qui trouvera cette classe et appellera .datepicker() pour vous.

Répondre

0

Quelque chose comme ce qui suit devrait fonctionner:

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

Oui, je vous remercie beaucoup. Je l'ai fonctionné. Je vais poster ce que j'ai si les autres veulent l'utiliser un peu. – kheit

Questions connexes