2012-01-11 27 views
6

Olası Çoğalt: Benim MVC uygulamada dinamik tip modeli kullanmak çalışıyorum
Dynamic Anonymous type in Razor causes RuntimeBinderExceptiondinamik tip

. denetleyicisi : Aşağıdaki kod var

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

ve görünümde ben:

'object' does not contain a definition for 'Name' (System.Exception {Microsoft.CSharp.RuntimeBinder.RuntimeBinderException) 
: Ben bu çalıştırıyorum zaman

@model dynamic 

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

, aşağıdaki hatayı alıyorum

Bu hatayı neden aldım? Hata ayıklama sırasında, imlecimi @Model'e koyarsam, Ad ve Aile adlı iki özelliğin olduğunu görebilirim.

+0

yüzünden yansıma hata ayıklama sırasında Model' özelliklerinin @ 'görebilirsiniz ... –

+0

Teşekkürler, neden hata alıyorum? Nesne bu özelliği vardır ve dinamik bir türüdür! – mans

cevap

16

Gösterdiğiniz şey dinamik bir tür değil. Bu anonim bir tip. Büyük bir fark var.

Adsız türleri model olarak kullanamazsınız. Bunun nedeni, derleyicinin olarak anonim türler yayımlamasıdır. Bu, sadece mevcut montaj ile erişilebilir oldukları anlamına gelir. Fakat bildiğiniz gibi, Razor görüntülemeleri ASP.NET çalışma zamanı tarafından bu anonim türlerin kullanılmasının hiçbir yolu olmayan ayrı meclisler olarak derlenmiştir.

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

ve sonra kontrolör eylem görünümüne Bu görünüm modelini geçmek var:

Açıkçası bu durumda doğru yolu bir görünüm modelini kullanmaktır böylece

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

görünümünüzü onunla çalışabilir:

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

Bazı insanlar (ben, asla böyle bir şey önermem) Ayrıca ViewBag kullanmak ve bu şekilde onlar bir model gerekmez:

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

ve ardından görünümde:

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

Açıklama için teşekkürler. ViewBag nasıl uygulandığını merak ediyorum? Dinamik bir modele sahip olabilir miyim? Bu yazının mümkün olduğunu söylüyor: http://blogs.msdn.com/b/rickandy/archive/2011/01/28/dynamic-v-strongly-typed-views.aspx ama yapamadım. – mans

+0

@ user654019, ViewBag, ViewData sözlüğünün etrafındaki dinamik bir sarıcıdır. Model olarak kullanılacak somut bir türünüz olmalı. 'Model dnyamic' kullanabilirsiniz, ancak bu model belirli bir türe işaret etmiyorsa (anonim bir nesne değil, cevabımda ana hatlarıyla belirttiğim nedenlerle anonim nesnelerle çalışamaz) sadece işe yaramaz. Bağladığınız blog yazısında, dnyamic modelini, hepsi yazılan "Blog", "List " gibi tanımlanmış somut sınıflara işaret ediyorlar. Tek bir anonim nesne yoktur. ASP.NET MVC'de bunları unutabilirsiniz. –

+0

Teşekkürler, Viewbag'in nasıl uygulandığına dair bana bir ipucu verebilir misiniz? Herhangi bir belge? – mans