I want to create a view using razor template, but I do not want to write a class for model, because in many views i will have many queries which will be returning diferent models.
我想使用razor模板创建一个视图,但我不想为模型编写一个类,因为在许多视图中我将有许多查询将返回不同的模型。
For example I have a linq query:
例如,我有一个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 */
};
I need to write a View for this query. This query returns a Articles.
我需要为此查询编写一个View。此查询返回文章。
Now I dont know how should looks like a model definition.
现在我不知道应该如何看起来像模型定义。
I tried to use this deffinition:
我试着用这个定义:
@model System.Collections.IEnumerable
But then I had an erros than fileds doesnt exists in object type:
但后来我有一个错误,而不是文件在对象类型中不存在:
*CS1061: 'object' does not contain a definition for 'addition_field' and no extension method 'addition_field' accepting a first argument of type 'object' could be found*
* CS1061:'object'不包含'addition_field'的定义,并且没有扩展方法'addition_field'接受类型'object'的第一个参数可以找到*
This is my model for which I do not want to write a next model. Of course
这是我的模型,我不想写下一个模型。当然
3 个解决方案
#1
41
The short answer is that using anonymous types is not supported, however, there is a workaround, you can use an ExpandoObject
简短的回答是不支持使用匿名类型,但是,有一种解决方法,您可以使用ExpandoObject
Set your model to @model IEnumerable<dynamic>
将模型设置为@model IEnumerable
Then in the controller
然后在控制器中
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;
}
}
#2
1
I think this is an even better solution:
我认为这是一个更好的解决方案:
http://buildstarted.com/2010/11/09/razor-without-mvc-part-iii-support-for-nested-anonymous-types/
http://buildstarted.com/2010/11/09/razor-without-mvc-part-iii-support-for-nested-anonymous-types/
This allows for nested anonymous types, which the aforementioned expando-object solution won't handle.
这允许嵌套的匿名类型,前面提到的扩展对象解决方案将无法处理。
#3
1
It seems you can't pass anonymous types but if you just want the values of the type you might pass an enumerable of an object array to view.
看起来你不能传递匿名类型,但是如果你只想要类型的值,你可以传递一个可枚举的对象数组来查看。
View:
视图:
@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>
Controller:
控制器:
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
41
The short answer is that using anonymous types is not supported, however, there is a workaround, you can use an ExpandoObject
简短的回答是不支持使用匿名类型,但是,有一种解决方法,您可以使用ExpandoObject
Set your model to @model IEnumerable<dynamic>
将模型设置为@model IEnumerable
Then in the controller
然后在控制器中
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;
}
}
#2
1
I think this is an even better solution:
我认为这是一个更好的解决方案:
http://buildstarted.com/2010/11/09/razor-without-mvc-part-iii-support-for-nested-anonymous-types/
http://buildstarted.com/2010/11/09/razor-without-mvc-part-iii-support-for-nested-anonymous-types/
This allows for nested anonymous types, which the aforementioned expando-object solution won't handle.
这允许嵌套的匿名类型,前面提到的扩展对象解决方案将无法处理。
#3
1
It seems you can't pass anonymous types but if you just want the values of the type you might pass an enumerable of an object array to view.
看起来你不能传递匿名类型,但是如果你只想要类型的值,你可以传递一个可枚举的对象数组来查看。
View:
视图:
@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>
Controller:
控制器:
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);
}
}
}