2017-05-11 10 views
1

私は、流暢な構文で強く型付けされたHTMLヘルパーを作成しようとしています。私は例をオンラインで見たが、彼らはすべてTagBuilderを使ってhtmlを構築している。代わりに、後でアクセスするために、CurrencyTextBoxクラスの元のHTMLヘルパーオブジェクトへの参照を保存したい(大量の有用な情報が含まれており、テキストボックスを作成するのにメソッドを使用することもできます)。流暢な構文で強く型付けされたHtmlHelperを作成するには?

以下のコードは機能しません。

拡張メソッド

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

CurrentTextBoxクラスIエラー

重大度コード説明メニュープロジェクトを取得ToString()方法内側しかし上記のコードで

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

、 ectファイルの行の抑制状態 エラーCS1061 'HtmlHelper'に 'TextBoxFor'の定義が含まれておらず、 'TextBoxFor'の拡張メソッドがありません。 'HtmlHelper'型の 引数を最初に受け入れることができました( usingディレクティブまたはアセンブリ参照?)

また、htmlhelperとexpressionをcostructorに渡すのもいいですか?あなたのoverrideToString() Methodeの中ToHtmlString()

答えて

0

変更Tostring()

例:

public override string ToString() 
{ 

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

    return textBox.ToHtmlString(); 
} 

と変更AddClass方法以下のように:

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

うまくいけば、それはあなたのための助けです。

0

まず、正しい構文を使用する必要があります。

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

クラスは予約キーワードです。あなたは、C#は大文字と小文字が区別され

return textBox.Tostring(); 
classNameの に名前を変更する必要があります。だからあなたはreturn textBox.ToString();を使用する必要があります。

0

それは私の一部

TextBoxFor方法はSystem.Web.Mvc.Html;名前空間にあるから、愚かな間違いでした。そのため、using System.Web.Mvc.Html;を追加した後に修正します。

関連する問題