2011-07-07 27 views
18

Tôi muốn tạo một khung nhìn bằng cách sử dụng mẫu dao cạo, nhưng tôi không muốn viết một lớp cho mô hình, vì trong nhiều khung nhìn, tôi sẽ có nhiều truy vấn sẽ trả về các mô hình khác nhau.xem dao cạo với lớp mô hình ẩn danh. Điều đó là có thể?

Ví dụ tôi có một truy vấn LINQ:

from p in db.Articles.Where(p => p.user_id == 2) 
select new 
{ 
    p.article_id, 
    p.title, 
    p.date, 
    p.category, 
    /* Additional parameters which arent in Article model */ 
}; 

tôi cần phải viết một Xem cho truy vấn này. Truy vấn này trả về một bài viết.

Bây giờ tôi không biết làm thế nào nên trông giống như một định nghĩa mô hình.

Tôi cố gắng để sử dụng deffinition này:

@model System.Collections.IEnumerable 

Nhưng sau đó tôi đã có một erros hơn fileds doesnt tồn tại trong loại đối tượng:

* CS1061: 'đối tượng' không chứa một định nghĩa cho 'addition_field 'và không có phương pháp mở rộng' addition_game_field 'chấp nhận đối số đầu tiên của loại' đối tượng 'có thể được tìm thấy *

Đây là mô hình của tôi mà tôi không muốn viết mô hình tiếp theo. Tất nhiên

+0

'@model System.Collections.Ienumerable

' –

+0

truy vấn Đó dường như chiếu một 'IEnumerable' các loại vô danh, không phải của 'Article' –

+0

Bạn có thể giải thích thêm lý do tại sao bạn không muốn viết một mô hình? Có lợi thế trong việc sử dụng các lớp mô hình - ví dụ: bạn có thể sử dụng intellisense, bạn có thể sử dụng nhiều hơn các lớp partial và có thể thêm các thuộc tính cho những thứ như xác nhận hợp lệ cho các lớp mô hình. – Stuart

Trả lời

39

Câu trả lời ngắn gọn là using anonymous types is not supported, tuy nhiên, there is a workaround, bạn có thể sử dụng một ExpandoObject

Đặt mô hình của bạn để @model IEnumerable<dynamic>

Sau đó, trong bộ điều khiển

from p in db.Articles.Where(p => p.user_id == 2) 
select new 
{ 
    p.article_id, 
    p.title, 
    p.date, 
    p.category, 
    /* Additional parameters which arent in Article model */ 
}.ToExpando(); 

... 
public static class Extensions 
{ 
    public static ExpandoObject ToExpando(this object anonymousObject) 
    { 
     IDictionary<string, object> anonymousDictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(anonymousObject); 
     IDictionary<string, object> expando = new ExpandoObject(); 
     foreach (var item in anonymousDictionary) 
      expando.Add(item); 
     return (ExpandoObject)expando; 
    } 
} 
+0

cảm ơn rất nhiều :) – nosbor

+0

+1 Tôi ước gì tôi có thể nâng cao điều này nhiều lần. 'ToExpando' là một ý tưởng tuyệt vời! –

1

Có vẻ như bạn không thể vượt qua các loại ẩn danh nhưng nếu bạn chỉ muốn các giá trị của loại bạn có thể vượt qua một liệt kê của một mảng đối tượng để xem.

Xem:

@model IEnumerable<object[]> 

@{ 
    ViewBag.Title = "Home Page"; 
} 

<div> 
    <table> 
     @foreach (var item in Model) 
     { 
      <tr> 
       <td>@item[0].ToString()</td> 
       <td>@item[1].ToString()</td> 
      </tr> 
     } 
    </table> 
</div> 

Bộ điều khiển:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web.Mvc; 

    namespace ZZZZZ 
    { 
     public class HomeController : Controller 
     { 
      public ActionResult Index() 
      { 

       List<object[]> list = new List<object[]> { new object[] { "test1", DateTime.Now, -12.3 } }; 

       return View(list); 
      } 


     } 

    } 
+0

Không tệ chút nào :-) – netfed

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