2012-05-16 39 views
0

我有我的整個數據庫控制器,該代碼如下:多個IQueryable在一個控制器中?

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的一個控制器,每個查詢不同的表。這是被禁止的嗎?因爲當我去localhost/api/Yoga/GetActionslocalhost/api/Yoga/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的,結果出來了罰款。

我搜索了類似的問題,並檢查了我的路由設置,控制器路徑和名稱沒有衝突。

我的路線(生成默認):

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 } 
     ); 
    } 

任何想法?

+2

爲什麼你返回IQueryable作爲你的動作方法的返回類型? – Shyju

+1

這是我看到使用MVC4的教程:http://goo.gl/mqzDD 前端使用upshot.js的地方,它直接處理IQueryable。 我不太確定確切的機制 – Bonk

+1

返回IQueryable允許您在該動作的查詢字符串中使用OData過濾器和選項 – diaho

回答

3

MVC4可能與您的HTTP動詞(Get)匹配所有名稱以'Get'開頭並且沒有參數的方法。請嘗試強制動作名稱:

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

編輯:

基於您粘貼的路線和控制器,我覺得你的路線應該是:

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 } 
    ); 
} 

也就是說,它應該有{action}在那裏。如果你只有一個'Get'方法,默認的MVC4路線會起作用。既然你有多個,你就必須強迫它根據路線選擇行動。

+0

剛剛嘗試過,我得到了同樣的錯誤。我嘗試了包括參數'localhost/api/Yoga/GetActions?BugId = 1',但它根本找不到動作:'在控制器'Yoga'找不到與請求相匹配的動作。' – Bonk

+1

不是因爲你有多個操作返回IQueryable,因爲我有控制器執行相同的操作。你能發佈你的路線嗎? – diaho

+0

謝謝!我剛更新了包括我的路線 – Bonk

相關問題