具有匿名类型模型类的剃刀视图.有可能的?

nos*_*bor 19 c# asp.net-mvc anonymous-types razor asp.net-mvc-3

我想使用razor模板创建一个视图,但我不想为模型编写一个类,因为在许多视图中我将有许多查询将返回不同的模型.

例如,我有一个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 */
};
Run Code Online (Sandbox Code Playgroud)

我需要为此查询编写一个View.此查询返回文章.

现在我不知道应该如何看起来像模型定义.

我试着用这个定义:

@model System.Collections.IEnumerable
Run Code Online (Sandbox Code Playgroud)

但后来我有一个错误而不是文件在对象类型中不存在:

*CS1061:'object'不包含'addition_field'的定义,并且没有扩展方法'addition_field'接受类型'object'的第一个参数可以找到*

这是我的模型,我不想写下一个模型.当然

Bro*_*ook 42

简短的回答是不支持使用匿名类型,但是,有一种解决方法,您可以使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)


rat*_*rus 7

如果您使用 C# 7.0+(在 Visual Studio 2017+ 中引入),最简单的解决方案是使用元组而不是匿名类型。

剃刀视图:“_MyTupledView.cshtml”

@model (int Id, string Message)

<p>Id: @Model.Id</p>
<p>Id: @Model.Message</p>
Run Code Online (Sandbox Code Playgroud)

然后当你绑定这个视图时,你只需发送一个元组:

var id = 123;
var message = "Tuples are great!";
return View("_MyTupledView", (id, message))
Run Code Online (Sandbox Code Playgroud)