【问题标题】:Async action in asp.net mvc controllerasp.net mvc 控制器中的异步操作
【发布时间】:2014-05-16 14:09:58
【问题描述】:

我目前正在处理一个 ASP.NET MVC 项目,我为此创建了一个控制器,该控制器具有一个返回 JsonResult 的 Action 方法。该操作基本上进入数据库,并根据传递给操作的表名执行动态 linq 查询并返回所需表的行。

我的 Action 方法如下所示:

public async Task<JsonResult> FieldValues(string table)
        {
            using (DbEntities ctx = new DbEntities())
            {                
                Type type = System.Reflection.Assembly.GetExecutingAssembly().GetType("MyWebApp.Models." + table);
                var query = ctx.Set(type).SqlQuery(string.Format("SELECT * FROM {0}", table));                               
                var data = await query.ToListAsync();               
                return Json(data, JsonRequestBehavior.AllowGet);
            }
        }

这个动作是使用 jquery ($.get(...)) 从视图中调用的... 我尝试调试动作,表正确传递,查询似乎没问题,但返回语句始终没有到达!

这是我第一次使用异步操作方法,也是我第一次使用“动态 linq”。

感谢任何关于我可能做错的帮助!

谢谢!

【问题讨论】:

  • 有什么东西返回给你的调用者(jQuery $.get 调用)?如果您进行同步调用(删除async 并调用ToList 而不是ToListAsync),这是否成功?
  • 不,我的 $.get 调用中的成功方法未达到,因为控制器中的操作方法未返回。这很奇怪,但我不能在查询对象上调用 ToList - 只有 ToListAsync 可用...
  • 这些表有多大?如果您暂时将查询修改为“SELECT TOP 1 * FROM {0}”怎么办?
  • 您的 Controller 是否派生自 AsyncController
  • 经过更多调试(决定使用 $.get 返回的 jquery 承诺可用的 done 和 fail 方法)我看到调用失败:消息“数据读取器与指定的“DataModel.AR15”。类型的成员“AR151”在数据读取器中没有同名的对应列。” - 现在我只需要理解这条消息并修复它:)

标签: c# asp.net-mvc json entity-framework


【解决方案1】:

好的...找到问题了! 长话短说:我使用的数据库表有一个与表本身同名的列。 EF 感到“害怕”并重命名了生成类中的列并在末尾添加了一个 1(类名 AR15,创建的属性是 AR151 而不是 AR15)。 由于这个原因,查询会默默地失败(没有例外)——当我为 $.get 承诺添加 done 和 fail 方法时,我才看到它。解决方案是在模型中手动创建一个具有我需要的结构的新实体,该结构对所有表都是通用的。 一旦完成,代码就像一个魅力一样工作,我什至删除了反射,因为我已经知道实体类型(新创建的)。

感谢您的帮助和建议!

【讨论】:

  • EF 并不害怕。 C# 不允许类型成员与声明类型同名。
猜你喜欢
  • 2012-10-29
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
  • 2015-02-19
  • 1970-01-01
  • 2016-01-14
相关资源
最近更新 更多