在一个控制器多IQueryable的? [英] Multiple IQueryable in one controller?

查看:120
本文介绍了在一个控制器多IQueryable的?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有我的整个数据库的一个控制器,code是如下:

I have a controller for my entire database, the code is below:

public class YogaController : DbDataController<Yoga.Models.YOGAEntities>
{
    public YogaController()
    {
    }

    public IQueryable<Yoga.Models.Action> GetActions(int BugId)
//GetActions retrieves "actions" table from the db, not Actions in MVC term 
    {
        return DbContext.Actions.Where(x => x.FK_BugsID == BugId);
    }
    public IQueryable<Yoga.Models.Label> GetRequiredLabels()
    {
        return DbContext.Labels.Where(x => x.IsRequired == true);
    }
    public IQueryable<Yoga.Models.Role> GetRoles()
    {
        return DbContext.Roles;
    }
    public IQueryable<Role> GetRoles2() //TODO: finish this
    {
        return DbContext.Roles.Where(x => x.RoleID == 1);
    }
    public IQueryable<Tag> GetTags(int actionid)
    {
        return DbContext.Tags.Where(x => x.J_Tags.Any(y => y.FK_ActionID == actionid));
    }
}

正如你可以看到我有多个IQueryable的一个控制器,每个查询不同的表。有什么事情是被禁止?因为当我去本地主机/ API /瑜伽/的getActions 本地主机/ API /瑜伽/ GetRequiredLabels 我得到的错误消息:

Multiple actions were found that match the request: 
 System.Linq.IQueryable`1[Yoga.Models.Label] GetRequiredLabels() on type Yoga.Controllers.YogaController
 System.Linq.IQueryable`1[Yoga.Models.Role] GetRoles() on type Yoga.Controllers.YogaController
 System.Linq.IQueryable`1[Yoga.Models.Role] GetRoles2() on type Yoga.Controllers.YogaController

当我禁用所有,但一个IQueryable的,结果出来了罚款。

When I disable all but one IQueryable, the results came out fine.

我用Google搜索了类似的问题,并检查了我的路由设置,也有控制的路径和名称没有冲突。

I have googled for similar issues and checked my routing settings, there are no conflicts in controller path and names.

我的路线(默认生成):

My Routes (default generated):

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
        //routes.MapRoute(
        //    name: "Default",
        //    url: "{controller}/{action}/{id}",
        //    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }

任何想法?

推荐答案

MVC4可能是符合HTTP动词(GET)针对与以'获取'和没有参数名称的所有方法。请尝试强制动作名称:

MVC4 is probably matching your HTTP Verb (Get) against all methods with names starting with 'Get' and no parameters. Try forcing the action name:

[ActionName("GetRequiredLabels")]
public IQueryable<Yoga.Models.Label> GetRequiredLabels()
...
[ActionName("GetActions")]
public IQueryable<Yoga.Models.Action> GetActions(int BugId)
... // etc

编辑:

,我认为你的路线应该是:

Based on the routes you pasted and your controller, I think your routes should be:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{action}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}

即。它应该有在那里 {行动} 。如果你只有一个单一的获取方法的默认MVC4路线是可行的。既然你有多重,你必须迫使它根据路线上挑的动作。

i.e. it should have the {action} in there. The default MVC4 route would work if you only had a single 'Get' method. Since you have multiple, you'll have to force it to pick the action based on the route.

这篇关于在一个控制器多IQueryable的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆