2011-07-07 12 views
18

私は剃刀のテンプレートを使用してビューを作成したいが、多くのビューでは異なるモデルを返す多くのクエリがあるため、モデルのクラスを作成したくない。例えば匿名型モデルクラスを含む剃刀ビュー。可能です?

私は、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 */ 
}; 

私はこのクエリのビューを記述する必要があります。このクエリはアーティクルを返します。

今、私はどのようにモデル定義のように見えるべきかわかりません。

私はこのdeffinitionを使用しようとしました:CS1061 *

:: 'オブジェクト'「はaddition_fieldの定義が含まれていません

@model System.Collections.IEnumerable 

しかし、その後、私はオブジェクト型に存在するdoesntのfiledsよりerrosを持っていました'拡張メソッド' addition_field 'は'オブジェクト 'タイプの最初の引数を受け入れることができませんでした*

これは私が次のモデルを書きたくない私のモデルです。もちろん

+0

'@model System.Collections.IEnumerable

' –

+0

そのクエリは匿名型のではなく、 'Article'の' IEnumerable'を投影しているようです –

+0

なぜモデルを書いたくないのかをもっと説明できますか?モデルクラスの使用には利点があります。あなたはintellisenseを使うことができます。部分クラスをより多く使うことができ、バリデーションのための属性をモデルクラスに追加することができます。 – Stuart

答えて

39

短い答えは、しかしusing anonymous types is not supportedthere is a workaround、あなたが @model IEnumerable<dynamic>

にあなたのモデルを設定しExpandoObject

を使用することができます次に、コントローラ

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

ありがとうたくさん:) – nosbor

+0

+1私はこれを複数回アップヴォートすることができたらいいと思う。 'ToExpando'は素晴らしいアイデアです! –

1

匿名型を渡すことはできないようですが、その型の値だけが必要な場合は、オブジェクト配列の列挙型を渡して表示することができます。

ビュー:

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

コントローラー:

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

まったく悪くない:-) – netfed

関連する問題