2011-07-07 18 views
18

Ustura şablonu kullanarak bir görünüm oluşturmak istiyorum, ancak model için bir sınıf yazmak istemiyorum çünkü birçok görünümde farklı modelleri döndürecek pek çok sorguya sahip olacağım.tıraş bıçağı görünümü. Bu mümkü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 */ 
}; 

ben bu sorgu için Görünüm yazmak gerekir:

Mesela ben bir linq sorgu var. Bu sorgu bir makale döndürür.

Şimdi bir model tanımına nasıl benzemesi gerektiğini bilmiyorum.

Bu deffinition kullanmaya çalıştı:

@model System.Collections.IEnumerable 

Ama sonra nesne türü var doesnt fileds daha bir hatalara vardı:

* CS1061: 'nesne' addition_field' için bir tanım içermiyor 'object_field' ve 'object' türünde bir ilk argümanı kabul eden 'add_field' bulunamadı. *

Bu, bir sonraki model yazmak istemediğim modelim. Tabii

+0

'@model System.Collections.IEnumerable

' Bu sorgu proje gibi görünüyor –

+0

anonim türleri 'IEnumerable', değil' Article' –

+0

Model yazmayı neden istemediğinizi daha fazla açıklayabilir misiniz? Model sınıflarının kullanımında avantajlar vardır - ör. intellisense'i kullanabilir, kısmi sınıflardan daha fazla faydalanabilirsiniz ve model sınıflarına doğrulama gibi şeyler için nitelikler ekleyebilirsiniz. – Stuart

cevap

39

kısa cevap using anonymous types is not supported Ancak there is a workaround, sen

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

çok teşekkür ederim :) – nosbor

+0

+1 Keşke bunu bir defadan fazla yapabilirim. ToExpando', harika bir fikir! –

1

Anonim türleri geçemezsiniz, ancak yalnızca türün değerlerini istiyorsanız, görüntülemek için bir nesne dizisini sayılabilir.

Görünüm:

@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> 

Denetleyici:

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

Hiç de fena değil :-) – netfed

İlgili konular