2017-05-11 1 views
1

J'essaye de créer l'aide HTML fortement typée avec la syntaxe courante. J'ai vu des exemples en ligne, mais ils utilisent tous TagBuilder pour construire le code HTML. Au lieu de cela je veux stocker une référence à l'objet d'assistance HTML d'origine dans la classe CurrencyTextBox pour un accès ultérieur (car il contient beaucoup d'informations utiles et je peux aussi utiliser sa méthode TextBoxFor pour créer une zone de texte).Comment créer HtmlHelper fortement typé avec une syntaxe fluide?

Le code ci-dessous ne fonctionne pas.

Méthode d'extension

public static class CurrencyTextBoxHelper 
{ 
    public static CurrencyTextBox<TModel, TValue> CurrencyFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression) 
    { 
     return new CurrencyTextBox<TModel, TValue>(helper, expression); 
    } 
} 

de classe CurrentTextBox

public class CurrencyTextBox<TModel, TValue>: IHtmlString 
{ 
    private RouteValueDictionary _attr = null; 
    private HtmlHelper<TModel> _helper; 
    private Expression<Func<TModel, TValue>> _expression; 

    public CurrencyTextBox(HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression) 
    { 
     _helper = helper; 
     _expression = expression; 
     _attr = new RouteValueDictionary(); 
    } 

    public CurrencyTextBox<TModel, TValue> AddClass(string class) 
    { 
     _attr.Add("class",class); 
     return this; 
    } 

    public CurrencyTextBox<TModel, TValue> Enabled(bool enabled) 
    { 
     if (!enabled) 
     { 
      _attr.Add("disabled", "disabled"); 
     } 
     return this; 
    } 
    public string ToHtmlString() 
    { 
     return ToString(); 
    } 

    public override string ToString() 
    { 
     // i get error at line below 

     var textBox = _helper.TextBoxFor(_expression, ModelMetadata.FromLambdaExpression(_expression, _helper.ViewData).EditFormatString, _attr); 

     return textBox.Tostring(); 
    } 
} 

Toutefois, dans le code ci-dessus, à l'intérieur ToString() méthode que j'obtiens l'erreur

Code de Gravité Description Proj ect Suppression de la ligne Fichier État Erreur CS1061 « HtmlHelper » ne contient pas une définition pour « TextBoxFor » et aucune méthode d'extension « TextBoxFor » accepter un premier argument de type « HtmlHelper » n'a pu être trouvée (vous manque une directive à l'aide ou une référence d'assemblage?)

Aussi est-il correct de passer htmlhelper et expression dans costructor?

Répondre

0

changement Tostring() à ToHtmlString() dans votre overrideToString() Methode:

Exemple:

public override string ToString() 
{ 

    var textBox = _helper.TextBoxFor(_expression, ModelMetadata.FromLambdaExpression(_expression, _helper.ViewData).EditFormatString, _attr); 

    return textBox.ToHtmlString(); 
} 

Et changer AddClass méthode comme ci-dessous:

public CurrencyTextBox<TModel, TValue> AddClass(string className) 
    { 
     _attr.Add("class",className); 
     return this; 
    } 

Espérons que c'est une aide pour vous.

0

D'abord, vous devez utiliser une syntaxe correcte.

public CurrencyTextBox<TModel, TValue> AddClass(string class) 

classe est réservé mot-clé. Vous devez renommer pour className

return textBox.Tostring(); 

C# est sensible à la casse. Donc, vous devez utiliser return textBox.ToString();

0

était erreur stupide de ma part

La méthode TextBoxFor est dans System.Web.Mvc.Html; espace de noms. donc après avoir ajouté using System.Web.Mvc.Html; le fixe.