Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc URL中不存在可选参数时,找不到Web API操作_Asp.net Mvc_Asp.net Mvc Routing_Asp.net Mvc 5_Asp.net Web Api2 - Fatal编程技术网

Asp.net mvc URL中不存在可选参数时,找不到Web API操作

Asp.net mvc URL中不存在可选参数时,找不到Web API操作,asp.net-mvc,asp.net-mvc-routing,asp.net-mvc-5,asp.net-web-api2,Asp.net Mvc,Asp.net Mvc Routing,Asp.net Mvc 5,Asp.net Web Api2,请帮忙。 为了能够在URL中使用方法,我必须更改Web API的路由: public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); // for MVC controllers routes.MapRoute(

请帮忙。 为了能够在URL中使用方法,我必须更改Web API的路由:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        // for MVC controllers
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Editions", action = "Index", id = UrlParameter.Optional }
        );

        // for Web API
        routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new  {  id = RouteParameter.Optional }
        );

    }
}
我有一个控制器

public class PositionsController : ApiController
{
    [HttpGet]
    public JToken Approved()
    {
        // some code here
    }
}
对于带有参数的方法,一切都很好,但我不能调用像
http://localhost/API/Positions/Approved
。我没有调用
Approved
方法,而是得到了404notfound错误。我做错了什么

有趣的部分:调用URL
http://localhost/API/Positions/Approved/whatever
有效。看起来ID并不像我想的那么随意


谢谢你的帮助

您的问题是第一条路线(MVC)被匹配,而不是您实际想要的路线

所以对于像
http://localhost/API/Positions/Approved
该应用程序正在寻找一个名为“APIController”的控制器,其操作名为“Positions”,字符串参数“id”将设置为“Approved”

快速解决方案是更改路由声明,使API路由显示在MVC路由之前,但如前所述,我会将路由分为各自的配置(RouteConfig和WebApiConfig),并确保在Global.asax.cs中以正确的顺序注册路由:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    WebApiConfig.Register(GlobalConfiguration.Configuration);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

或者,如果您使用的是WebApi2,则可以使用属性路由来简化操作。

这是您定义的唯一路由还是以前有其他路由?我刚刚构建了您的场景,效果很好。你的应用程序中有更多内容。更多路线,或控制器中的更多内容您是否碰巧将路线放入
RouteConfig
而不是
WebApiConfig
?它们的工作原理稍有不同。很抱歉不清楚。现在我用所有路线配置编辑了我的问题。是的,它在RouteConfig中。维特特,请你再解释一下好吗?好的!就是这样!谢谢。配置顺序的改变成功了。