2011-02-11 53 views
28

誰かが私に何かを明確にしてもらえますか?私のASP.NET MVC 2アプリケーションでは、私は次のメソッドが含まれBaseViewModelクラスを持っている:型引数は、その使用法から推論できません。明示的に型引数を指定してみてください

public virtual IDictionary<string, object> GetHtmlAttributes<TModel, TProperty> 
         (Expression<Func<TModel, TProperty>> propertyExpression) 
{ 
    return new Dictionary<string, object>(); 
} 

アイデアがベースの、それぞれの子のviewmodelは、このメソッドをオーバーライドして、HTML属性の適したセットを提供することができていますビューでレンダリングするためにいくつかのロジック、上:上の行のように使用されたとき、私はビューを打ったとき

<%: Html.TextBoxFor(model => model.MyProperty, Model.GetHtmlAttributes 
               (model => model.MyProperty)) %> 

しかし、私はコンパイルエラーを取得:

METのための型引数hod '...BaseViewModel.GetHtmlAttributes<TModel,TProperty> Expression<System.Func<TModel,TProperty>)'はその使用から推測できません。型引数を明示的に指定してみてください。

<%: Html.TextBoxFor(model => model.MyProperty, Model.GetHtmlAttributes 
          <ChildModel, string>(model => model.MyProperty)) %> 

私はちょうどそれが何の問題HtmlHelper/TextBoxFor拡張メソッドではそうしていない、それが型を推論しようとする方法として、いくつかの明確さを探しています:?私は次のことを行う必要があり

私のコードは、BaseViewModelから継承任意のタイプのためにすることができ、一方、ビュー内のHtmlHelperは自動的に、ページの上部にViewUserControlに指定されているものと同じタイプになりますので、

はそれですか?それは私のモデル/プロパティ型を推論できるようにこれを書くことは可能ですか?

+5

聖なる水平スクロールバーバットマン! –

+2

まあまあです。私たちの30インチモニターでは、これらの小さなウィンドウで前後にコードをスクロールするのにちょうど6.5インチしかないというのは不合理です。 SAのメンバーに来て、VCのお金を取って、ダイナミックなページサイジングを手に入れよう! – Slaggg

答えて

11

あなたの例では、コンパイラは、どのタイプがTModelであるべきかを知る方法がありません。あなたは、あなたがおそらく拡張メソッドを使って何をしようとしているかに近い何かをすることができます。

static class ModelExtensions 
{ 
    public static IDictionary<string, object> GetHtmlAttributes<TModel, TProperty> 
     (this TModel model, Expression<Func<TModel, TProperty>> propertyExpression) 
    { 
     return new Dictionary<string, object>(); 
    } 
} 

しかし、あなたはvirtualに似た何かを持っていることができないだろう、と思います。

EDIT:

実は、あなたは自己参照ジェネリックを使用して、virtualを行うことができます。ウェブで

class ModelBase<TModel> 
{ 
    public virtual IDictionary<string, object> GetHtmlAttributes<TProperty> 
     (Expression<Func<TModel, TProperty>> propertyExpression) 
    { 
     return new Dictionary<string, object>(); 
    } 
} 

class FooModel : ModelBase<FooModel> 
{ 
    public override IDictionary<string, object> GetHtmlAttributes<TProperty> 
     (Expression<Func<FooModel, TProperty>> propertyExpression) 
    { 
     return new Dictionary<string, object> { { "foo", "bar" } }; 
    } 
} 
-3

インスタンスではなくタイプを参照しています。 2番目と4番目のコードサンプルの例では、 'Model'を小文字にしてください。

Model.GetHtmlAttributes 

model.GetHtmlAttributes 
+0

提案に感謝しますが、私はそれにモデルオブジェクトの特定のインスタンス(ビューのModelプロパティを公開)を与える必要があります。 'model'はTextBoxForヘルパーのhtmlAttributesパラメータのコンテキストには実際には存在しません。 –

3

C#コンパイラであるべきは、Argの推論型(TModelの)arg.MyPropertyのタイプ(TProperty)に対してのみラムダ

arg => arg.MyProperty 

を有します。それは不可能だ。

14

私は、私の解決策を、この同じ問題を抱えていました。設定ファイル:

<compilation debug="true>

<compilation debug="true" targetFramework="4.0">

+1

ありがとうたくさんのジム!あなたは私の日を救った、私は数日間グーグルで、主な質問の解決策を見つけられなかったが、ここで小さなコメントであなたを見つける!私はMVC 4.0に付属しているVS 2012を使用しています。targetFramework = "4.0"を追加すると、ViewBag、Html.TextboxForなどの赤線の問題が解決されました。 – Nestor

+0

http: ://stackoverflow.com/questions/13695497/visual-studio-red-lines-under-viewbag-and-html-textboxfor-helpers-in-views/13695498#13695498)、あなたの答えを使用し、それのための信用を持っています。それが他人を助けることを願って – Nestor

+0

ジムに感謝、あなたは私の日を救った。このtargetFrameworkがなぜ重要であるか説明できますか?どのようにこれを把握しましたか? – Vincent

17

に変更されなければならなかった私は、この質問が既に受け入れ答えを持っているけど、私にとっては、私が何であったかに簡単な解決策は、.NET初心者がありました間違っていると私は共有すると思った。

私はこれをやっていた

@Html.HiddenFor(Model.Foo.Bar.ID) 

何私のために働いたことはこれに変更しました:

@Html.HiddenFor(m => m.Foo.Bar.ID) 

( "m" はモデルオブジェクトを表す任意の文字列です)

0

nullを汎用TValueのパラメータに渡すとき、この問題を解決するために役立ちました。これを回避するには、null値をキャストする必要があります。

(string)null 

(int)null 

など

4

も、このエラーがキャッシュ問題と関連しています。

私は同じ問題を抱えていましたが、解決策をもう一度とに解決しました。

+1

私にとってはキャッシングの問題でもありましたが、Visual Studioを再起動した後で解決しました。私にとってこれは、参照されていたモデルの名前空間を更新した後に起こりました。 – WillemdeKok

+1

これを見て、それは私のためにキャッシングしていた! – lozzajp

関連する問題