【问题标题】:MVC route is not using default actionMVC 路由未使用默认操作
【发布时间】:2018-01-24 19:08:32
【问题描述】:

在我的 web api 中,我创建了这个控制器:

public class DistributionGroupController : ApiController
{
    [HttpGet]
    public ServiceResult Index(string id)
    {
        if (id == null)
            return null;
        else
            return new ServiceResult();
    }
}

另外,这是我的路线配置。我将我的通讯组路由的默认操作指定为“索引”:

    routes.MapHttpRoute(
        "Api action",
        "Api/{controller}/{action}"
    );
    routes.MapHttpRoute(
        "Api get",
        "Api/{controller}"
    );
    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
    /*This is the route in question*/
    routes.MapHttpRoute(
        "DistGroupRoute",
        "api/distributiongroup/{id}/{action}",
        new { controller = "DistributionGroup", action = "Index" }
    );

在我看来,我正在使用这个脚本来(尝试)点击我的控制器:

$.ajax({
    url: "api/distributiongroup/4567bn57n5754",
    cache: false,
    success: function (response) {
        alert('success');
    }
});

但我的 ajax 调用收到 404 Not Found 错误。但是,如果我将 index 从我的 ajax 调用附加到我的 url,我的控制器就会被命中。因此,从本质上讲,这起作用:

        api/distributiongroup/4567bn57n5754

但这确实有效:

        api/distributiongroup/4567bn57n5754/index

我的理解是,如果我没有在我的网址中指定我的操作,我的默认操作应该会受到影响。我可能在这里缺少什么?而且,更重要的是,当我使用这样的 url 时,如何让我的 Index 控制器受到攻击:

        api/distributiongroup/4567bn57n5754

(未指定Index 操作?

【问题讨论】:

    标签: c# ajax asp.net-mvc asp.net-mvc-4 routes


    【解决方案1】:
    routes.MapHttpRoute(
        "DistGroupRoute",
        "api/distributiongroup/{id}",
        new { controller = "DistributionGroup", action = "Index" }
    );
    

    代替:

    routes.MapHttpRoute(
        "DistGroupRoute",
        "api/distributiongroup/{id}/{action}",
        new { controller = "DistributionGroup", action = "Index" }
    );
    

    不需要在路由模板中添加 {action},因为您已经在默认对象中添加了它。

    基本上,你说: 只要有与此路由模板 (api/distributiongroup/{id}/{action}) 匹配的 URL,就会触发 DistributionGroup 控制器中的 Index 操作并传递 id 参数。

    【讨论】:

      【解决方案2】:

      这是因为我在路由配置中指定路由的顺序。我按以下顺序指定它们:

              routes.MapHttpRoute(
                  "Api action",
                  "Api/{controller}/{action}"
              );
              routes.MapHttpRoute(
                  "Api get",
                  "Api/{controller}"
              );
              routes.MapRoute(
                  "Default", // Route name
                  "{controller}/{action}/{id}",
                  new { controller = "Home", action = "Index", id = UrlParameter.Optional }
              );
              routes.MapHttpRoute(
                  "DistGroupRoute",
                  "api/distributiongroup/{id}/{action}",
                  new { controller = "DistributionGroup", action = "Index" }
              );
      

      似乎这条路线(我的默认路线):

      {controller}/{action}/{id}
      

      当我没有在我的 url 中指定 index 时,覆盖了我的 distributiongroups 路由。我仍然不完全确定为什么会这样。但是重新排序我的路线配置修复了它。我只需要将我的distributiongroup 路由放在我的默认路由之前:

              routes.MapHttpRoute(
                  "DistGroupRoute",
                  "api/distributiongroup/{id}/{action}",
                  new { controller = "DistributionGroup", action = "Index" }
              );
              routes.MapHttpRoute(
                  "Api action",
                  "Api/{controller}/{action}"
              );
              routes.MapHttpRoute(
                  "Api get",
                  "Api/{controller}"
              );
              routes.MapRoute(
                  "Default", // Route name
                  "{controller}/{action}/{id}",
                  new { controller = "Home", action = "Index", id = UrlParameter.Optional }
              );
      

      【讨论】:

      猜你喜欢
      • 2011-08-01
      • 2013-04-09
      • 1970-01-01
      • 2020-03-27
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 2012-08-14
      • 2010-11-01
      相关资源
      最近更新 更多