2012-01-11 30 views
6

thể trùng lặp:
Dynamic Anonymous type in Razor causes RuntimeBinderExceptionloại động theo quan điểm của MVC

Tôi đang cố gắng sử dụng một mô hình kiểu động trong ứng dụng MVC của tôi. Tôi có đoạn mã sau: trong điều khiển:

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

và trong giao diện tôi có:

@model dynamic 

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

Khi tôi đang chạy này, tôi nhận được lỗi sau:

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

Tại sao tôi gặp lỗi này? Trong khi gỡ lỗi, nếu tôi đặt con trỏ lên @Model, tôi có thể thấy rằng nó có hai thuộc tính được gọi là Tên và Gia đình.

+0

Bạn có thể thấy '@ tính Model' trong debug vì phản ánh ... –

+0

Cảm ơn, Vì vậy, tại sao tôi nhận được lỗi? Đối tượng có thuộc tính đó và nó là kiểu động! – mans

Trả lời

16

Nội dung bạn đã hiển thị không phải là loại động. Đó là một loại ẩn danh. Có một sự khác biệt rất lớn.

Bạn không thể sử dụng các loại ẩn danh làm mô hình. Lý do cho điều này là do trình biên dịch phát ra các loại ẩn danh là nội bộ. Điều này có nghĩa là chúng chỉ có thể truy cập với assembly hiện tại. Nhưng như bạn đã biết, các khung nhìn Razor được biên dịch bởi thời gian chạy ASP.NET như các assembly riêng biệt không có cách nào để sử dụng các kiểu ẩn danh đó.

Rõ ràng cách chính xác trong trường hợp này là sử dụng một mô hình điểm:

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

và sau đó có hành động điều khiển của bạn vượt qua mô hình điểm này để xem:

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

để xem bạn có thể làm việc với nó:

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

Một số người (không phải tôi, tôi sẽ không bao giờ đề xuất bất cứ điều gì như thế này) cũng sử dụng ViewBag và cách này họ không cần một mô hình:

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

và sau đó trong giao diện:

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

Cảm ơn bạn đã giải thích. Tôi tự hỏi làm thế nào ViewBag được thực hiện? Tôi có thể có một mô hình động không? bài đăng này nói rằng có thể: http://blogs.msdn.com/b/rickandy/archive/2011/01/28/dynamic-v-strongly-typed-views.aspx nhưng tôi không thể làm điều đó. – mans

+0

@ user654019, ViewBag chỉ là một trình bao bọc động xung quanh từ điển ViewData. Bạn cần phải có một số loại cụ thể để được sử dụng làm mô hình. Bạn có thể sử dụng '@model dnyamic' nhưng nếu mô hình này không trỏ đến một loại cụ thể (không phải đối tượng ẩn danh, nó không thể làm việc với các đối tượng ẩn danh vì những lý do tôi nêu trong câu trả lời của tôi). Trong bài đăng trên blog bạn đã liên kết, họ đang trỏ mô hình dnyamic đến các lớp cụ thể mà họ đã định nghĩa như 'Blog', 'Danh sách ', tất cả đều được nhập mạnh mẽ. Không có một đối tượng ẩn danh nào. Bạn có thể quên chúng trong ASP.NET MVC. –

+0

Cảm ơn, Bạn có thể vui lòng cho tôi một số đầu mối về cách Viewbag được thực hiện? Bất kỳ tài liệu nào? – mans

Các vấn đề liên quan