0

データベース全体のコントローラーがあります。コードは次のとおりです。

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

ご覧のとおり、1つのコントローラーに複数の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

1つを除くすべての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 }
        );
    }

何か案は?

4

1 に答える 1

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}です。デフォルトのMVC4ルートは、「Get」メソッドが1つしかない場合に機能します。複数あるので、ルートに基づいてアクションを選択するように強制する必要があります。

于 2012-05-16T18:35:34.550 に答える