2012-01-11 112 views
6

可能重複:
Dynamic Anonymous type in Razor causes RuntimeBinderException動態類型MVC視圖

我想在我的MVC應用程序使用動態類型的模型。我有以下代碼: 在控制器:

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

,並在視圖中我有:

@model dynamic 

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

當我運行此,我收到以下錯誤:

'object' does not contain a definition for 'Name' (System.Exception {Microsoft.CSharp.RuntimeBinder.RuntimeBinderException) 

爲什麼我得到這個錯誤? 在調試期間,如果我將光標放在@Model上,我可以看到它有兩個名爲Name和Family的屬性。

+0

你可以因爲反射的調試過程中看到'@ Model'屬性... – 2012-01-11 13:53:01

+0

謝謝,那麼爲什麼我得到錯誤?該對象具有該屬性並且是動態類型! – mans 2012-01-11 13:54:30

回答

16

你顯示的不是動態類型。這是一個匿名類型。有很大的差異。

您不能使用匿名類型作爲模型。原因是編譯器發出匿名類型內部。這意味着它們只能通過當前的程序集訪問。但正如你所知道的Razor視圖是由ASP.NET運行時編譯的獨立程序集,它們無法使用這些匿名類型。

顯然,在這種情況下,正確的方法是使用一個視圖模型:

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

,然後讓你的控制器動作通過此視圖模型到視圖:

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

讓您的看法可以使用它:

@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 2012-01-11 15:07:45

+0

@ user654019,ViewBag只是​​ViewData詞典的一個動態包裝。你需要有一些具體的類型作爲模型。你可以使用'@model dnyamic',但如果這個模型沒有指向特定的類型(不是匿名對象,由於我在我的答案中概述的原因,它不能用於匿名對象),它根本行不通。在你已經鏈接的博客文章中,他們將dnyamic模型指向他們定義的具體類,比如'Blog','List ',它們都是強類型的。沒有一個匿名對象。你可以在ASP.NET MVC中忘記它們。 – 2012-01-11 15:17:38

+0

謝謝,你可以給我一些關於Viewbag如何實現的線索嗎?任何文件? – mans 2012-01-11 15:22:43