5

私のMVCアプリケーションでは:

コントローラで、セッションに保存される動的タイプのリストを作成しました。次に、ビューはオブジェクトにアクセスしようとしますが、例外がスローされます。'object' does not contain a definition for 'a'

コード :

// Controller 

List<dynamic> myLists = new List<dynamic>();
for(int i=0; i<3; i++){
    var ano = new { a='a' , b = i };
    myLists.Add(ano);
}

Session["rows"] = myLists;

私からしてみれば

// My View
foreach( dynamic row in (Session["rows"] as List<dynamic>)){
    <div>@row</div> // output {a:'a', b :1}
    <div>@row.a</div> // throw the error.
}

ノート

  1. デバッグ時に、ウォッチビューでプロパティ/値を確認できます
  2. 私の場合、ajaxを使用してメソッドを呼び出したため、リストをViewBagに保存できません。
  3. =>同じ結果のvar代わりobjectにを使用しようとしましたdynamic
  4. これはMVCやRazor engine
  5. 私はaspxビュー(かみそりではない)を使用しようとしましたが、同じ結果になりました

デバッガーがプロパティを認識できる場合、プロパティにアクセスできないのはなぜですか。また、この問題を解決するにはどうすればよいですか。

4

1 に答える 1

4

Anonymous types are internal to the assembly that declares them. The dynamic API respects accessibility. Since the value is there (from "// output..."), I must conclude this is an accessibility issue. IIRC early builds of razor/MVC3 had an issue with exactly this scenario, although from memory that problem went away with one of the service packs - you might want to check you are up-to-date with razor / MVC3 / .NET / VS patches. However, the easiest fix here will be to declare a proper POCO class:

public class MyViewModelType {
    public char A {get;set;}
    public int B {get;set;}
}

and use that instead of an anonymous type. This will also mean you don't need to use dynamic, which is unnecessary and overkill here.

于 2012-08-13T07:58:32.120 に答える