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)
如果您使用 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)