2012-01-11 6 views
6

可能性の重複:
Dynamic Anonymous type in Razor causes RuntimeBinderException動的な型

私は私のMVCアプリケーションでのダイナミック型モデルを使用しようとしています。コントローラに :私は、次のコードを持っている

var model = new { Name = "test name", Family = "m" }; 
return this.View(model); 

を、ビューに私が持っている:

'object' does not contain a definition for 'Name' (System.Exception {Microsoft.CSharp.RuntimeBinder.RuntimeBinderException) 
:私はこれを実行している場合は

@model dynamic 

@if(Model!=null) 
{ 
    <p> @Html.Raw(Model.Name) </p> 
} 

、私は次のエラーを取得しています

このエラーはなぜ発生しますか? デバッグ中に@Modelにカーソルを置くと、名前とファミリという2つのプロパティがあることがわかります。

+0

あなたはので、反射のデバッグ中にModel'プロパティ@ '見ることができます... –

+0

ありがとう、なぜ私はエラーが表示されますか?オブジェクトはそのプロパティを持ち、動的な型です! – mans

答えて

16

あなたが示したものは、ダイナミックタイプではありません。それは匿名のタイプです。大きな違いがあります。

モデルとして匿名型を使用することはできません。これは、コンパイラが内部のという匿名型を発行するためです。これは、現在のアセンブリでのみアクセス可能であることを意味します。しかし、あなたが知っているように、かみそりのビューは、ASP.NETランタイムによって、それらの匿名型を使用する方法を持たない別々のアセンブリとしてコンパイルされます。あなたのビューよう

var model = new MyViewModel { Name = "test name", Family = "m" }; 
return this.View(model); 

public class MyViewModel 
{ 
    public string Name { get; set; } 
    public string Family { get; set; } 
} 

してからコントローラのアクションを表示するには、このビューモデルを渡しています

もちろん、この場合の正しい方法は、ビューモデルを使用することです

@model MyViewModel 
@if (Model != null) 
{ 
    <p>@Model.Name</p> 
} 

一部の人々(私はこのようなことは絶対に勧めません)またViewBagを使用して、この方法は、彼らはモデルを必要としません:

ViewBag.Name = "test name"; 
ViewBag.Family = "m"; 
return this.View(); 

、その後ビューで:

<p>@ViewBag.Name</p> 
+0

ありがとうございます。私はどのようにViewBagが実装されているのだろうか?ダイナミックモデルはありますか?この投稿は可能です:http://blogs.msdn.com/b/rickandy/archive/2011/01/28/dynamic-v-strongly-typed-views.aspxしかし、私はそれを行うことができませんでした。 – mans

+0

@ user654019、ViewBagはViewDataディクショナリを囲む単なる動的ラッパーです。モデルとして使用するには、いくつかの具体的な型が必要です。 '@model dnyamic'を使うことができますが、このモデルが特定の型を指していない場合(匿名オブジェクトではなく、私の答えに記載されている理由で匿名オブジェクトでは動作しません)、単に動作しません。あなたがリンクしているブログ記事では、彼らは 'Blog'、' List 'のように定義された具体的なクラスにdnyamicモデルを指しています。匿名のオブジェクトは1つもありません。あなたはASP.NET MVCでそれらを忘れることができます。 –

+0

ありがとう、私はViewbagがどのように実装されているかについていくつか手がかりを与えてくれますか?どんなドキュメント? – mans

関連する問題