Asp.net mvc 使用ToExpando方法的问题
嗨,我尝试使用ToExpando解决方案在razor视图中使用匿名类。 我使用此解决方案-> 我将写下我所做的:Asp.net mvc 使用ToExpando方法的问题,asp.net-mvc,linq,entity-framework,asp.net-mvc-3,razor,Asp.net Mvc,Linq,Entity Framework,Asp.net Mvc 3,Razor,嗨,我尝试使用ToExpando解决方案在razor视图中使用匿名类。 我使用此解决方案-> 我将写下我所做的: 我添加了一个文件扩展名.cs,其中我放置了以下代码: public static class Extensions { public static ExpandoObject ToExpando(this object anonymousObject) { IDictionary<string, object> anonymousDicti
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;
}
}
我做错了什么?您需要先调用
.AsEnumerable()
或.ToList()
以强制在客户端上运行Expando
。尝试:
dynamic articles = (from p in db.Articles.Where(p => p.user_id == 2_
select new
{
p.article_id,
p.title,
p.date,
p.category,
AverageScore = db.Articles_Scores
.Where(o => o.user_id == p.user_id && p.article_id == o.article_id)
.Average(m => m.score)
}).AsEnumerable()
.Select(r => r.ToExpando());
编辑:确保声明动态
非var
编辑2:在您的for
外观中,您再次声明了var
。将其更改为:
@foreach (dynamic item in Model) {
// some code
@item.article_id // HERE IS EXCEPTION
}
问题是
HtmlHelper.AnonymousObjectToHtmlatAttributes()
,它正在替换
属性名为'''.'和'-'。查看该方法的注释。好的,在前两个答案的基础上,我添加了另一个扩展方法,我很惊讶这里没有看到:
public static List<ExpandoObject> ToExpandoList<T>(this IEnumerable<T> ie) {
return ie.Select(o => o.ToExpando()).ToList();
}
您还没有显示实际调用
扩展的代码。对不起,我忘了。现在我更新了。你是说我应该使用ToExpando().AsEnumerable()?如果是这样,我给出了一个类似的例外:/No;您需要首先调用AsEnumerable
,以便ToExpando
在clientOk上运行。但是我得到了一个例外:RuntimeBinderException:'System.Dynamic.ExpandoObject'不包含'article_id'的定义我得到了一个例外:RuntimeBinderException:'System.Dynamic.ExpandoObject'不包含'article_id'的定义谢谢Matthew的帮助,但它仍然不起作用。我使用了IEnumerable,现在我使用了你的解决方案,但仍然存在相同的问题。真奇怪。。。因为它在controler方法中工作得非常完美(foreach工作得非常好,我可以读取每个属性),但在View(Razor)中,我得到了相同的例外。我真的不知道我做错了什么…我更新了我的帖子。查看linq查询下面的代码。我还通过评论检查了一个我遇到异常的地方。对我有效的是这样做。。。(从…(选择新建{}).ToExpando()).ToList()。基本上,确保expando位于实际创建的对象上,而不是之后。用另一种方法(使用新的选择)也会起作用,实际上可能看起来更干净。编辑1非常重要,因为对象是在那里创建的。在我的例子中,编辑2不是必需的,即@foreach(模型中的var项)工作得很好。ToExpando().ToList()对我不起作用,但是你的.ToExpandoList()助手成功了。
dynamic articles = (from p in db.Articles.Where(p => p.user_id == 2_
select new
{
p.article_id,
p.title,
p.date,
p.category,
AverageScore = db.Articles_Scores
.Where(o => o.user_id == p.user_id && p.article_id == o.article_id)
.Average(m => m.score)
}).AsEnumerable()
.Select(r => r.ToExpando());
@foreach (dynamic item in Model) {
// some code
@item.article_id // HERE IS EXCEPTION
}
public static List<ExpandoObject> ToExpandoList<T>(this IEnumerable<T> ie) {
return ie.Select(o => o.ToExpando()).ToList();
}
var peoples = from f in "tom dick susan roberto".Split(' ')
select new { FirstName = f, Age = f.Length };
ViewBag.People = peoples.ToExpandoList();