2012-01-11 19 views
6

Powiel możliwe:
Dynamic Anonymous type in Razor causes RuntimeBinderExceptiondynamiczny typ w MVC widoku

Próbuję użyć dynamicznego modelu typu w mojej aplikacji MVC. Mam następujący kod: w kontrolerze:

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

iw widoku mam:

@model dynamic 

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

Kiedy używam tego, otrzymuję następujący błąd:

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

Dlaczego pojawia się ten błąd? Podczas debugowania, jeśli ustawię kursor na @Model, widzę, że ma on dwie właściwości o nazwie Name i Family.

+0

Można zobaczyć '@ właściwości model' podczas debugowania ponieważ refleksji ... –

+0

Dzięki, więc dlaczego dostaję błąd? Obiekt ma tę właściwość i jest typu dynamicznego! – mans

Odpowiedz

16

To, co pokazałeś, nie jest typem dynamicznym. To anonimowy typ. Istnieje ogromna różnica.

Nie można używać typów anonimowych jako modeli. Powodem tego jest fakt, że kompilator emituje anonimowe typy jako wewnętrzne. Oznacza to, że są dostępne tylko z bieżącym montażem. Ale jak wiadomo, widoki Razor są kompilowane przez środowisko wykonawcze ASP.NET jako oddzielne złożenia, które nie mają możliwości użycia tych anonimowych typów.

Oczywiście poprawny sposób w tym przypadku jest użycie modelu wyświetlania:

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

i wtedy twoje działanie kontroler zdać ten widok modelu do widoku:

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

tak, że widok może z nim pracować:

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

Niektórzy ludzie (nie ja, nigdy bym tego nie polecił) również użyć ViewBag i w ten sposób, że nie potrzebują modelu:

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

a następnie w widoku:

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

Dzięki za wyjaśnienie. Zastanawiam się, w jaki sposób wdrożono ViewBag? Czy mogę mieć model dynamiczny? ten post mówi, że jest to możliwe: http://blogs.msdn.com/b/rickandy/archive/2011/01/28/dynamic-v-strongly-typed-views.aspx, ale nie mogłem tego zrobić. – mans

+0

@ user654019, ViewBag jest tylko dynamicznym opakowaniem w słowniku ViewData. Musisz mieć konkretny typ, który zostanie użyty jako model. Możesz użyć '@model dnyamic', ale jeśli ten model nie wskazuje konkretnego typu (nie anonimowy obiekt, nie może pracować z anonimowymi obiektami z powodów, które przedstawiłem w mojej odpowiedzi) to po prostu nie zadziała. W blogu, który połączyłeś, wskazuje się model dnyamiczny na konkretne klasy, które zdefiniowano jako 'Blog',' List ', wszystkie są mocno wpisane. Nie ma jednego anonimowego obiektu. Możesz o nich zapomnieć w ASP.NET MVC. –

+0

Dzięki, czy możesz podać mi jakieś wskazówki dotyczące implementacji pakietu Viewbag? Dowolny dokument? – mans

Powiązane problemy