web-dev-qa-db-ja.com

匿名型モデルクラスのかみそりビュー。可能です?

かみそりのテンプレートを使用してビューを作成したいのですが、モデルのクラスを作成したくありません。多くのビューで、さまざまなモデルを返すクエリが多数あるためです。

たとえば、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 */
};

このクエリのビューを作成する必要があります。このクエリはArticlesを返します。

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

私はこの定義を使おうとしました:

@model System.Collections.IEnumerable

しかし、その後、ファイルがオブジェクトタイプに存在しないよりもエラーが発生しました。

* CS1061: 'object'には 'addition_field'の定義が含まれておらず、タイプ 'object'の最初の引数を受け入れる拡張メソッド 'addition_field'が見つかりませんでした*

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

20
nosbor

簡単に言うと、 匿名タイプの使用はサポートされていません 、ただし 回避策がありますExpandoObjectを使用できます

モデルを@model IEnumerable<dynamic>に設定します

次に、コントローラーで

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;
    }
}
42
Brook

これはさらに良い解決策だと思います。

http://buildstarted.com/2010/11/09/razor-without-mvc-part-iii-support-for-nested-anonymous-types/

これにより、前述のエキスパンドオブジェクトソリューションでは処理できないネストされた匿名型が可能になります。

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);
            }


        }

    }
1
MirlvsMaximvs

C#7.0以降(Visual Studio 2017以降で導入)を使用している場合の最も簡単な解決策は、匿名型ではなくタプルを使用することです。

かみそりのビュー: "_ MyTupledView.cshtml"

@model (int Id, string Message)

<p>Id: @Model.Id</p>
<p>Id: @Model.Message</p>

次に、このビューをバインドすると、タプルを送信するだけです。

var id = 123;
var message = "Tuples are great!";
return View("_MyTupledView", (id, message))
1
raterus