【问题标题】:Controller action "Index" not invoked with default setting未使用默认设置调用控制器操作“索引”
【发布时间】:2013-05-20 11:31:09
【问题描述】:

我有一个 ASP.NET Web 应用程序项目,我实现了一个 WebApi 控制器,现在继续使用 MVC 控制器。

我添加了一个新的 MVC 控制器(例如“测试”)并选择使用“空读写操作”添加它。

控制器是使用各种 CRUD 方法创建的,但是 Index 操作的行为异常。

默认情况下,Index 操作不接受任何参数:

public ActionResult Index()
{
    return View();
}

现在,如果我尝试使用 url "/Test/Index" 调用此方法,则不会调用该方法。

但是,如果我输入 url "/Test/Index/1",则会运行 Index 操作。

在我看来它与路由有关,所以我检查了 RouteConfig 类,它看起来像:

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

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

Id 设置为可选,我的理解是不应该要求我在 Index 方法中提供参数值?

我创建了另一个项目并检查了此行为,它工作正常。

那么想知道在这个项目中是什么让 MVC 控制器的行为有所不同?

将 WebApi 控制器与 MVC 控制器混合是否会产生一些副作用(使其成为一种特殊情况)?

如果您需要任何信息来回答这个问题,请告诉我。


更新:

我确实根据我的要求修改了 WebApiConfig 以使 API 控制器工作,它看起来像这样:

public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "{controller}/{action}",
            defaults: new { controller = "iclock", action = "cdata" }
        );
    }

我不明白为什么它会影响 MVC 控制器路由?我现在得到它并提供了答案。


更新 2:

在这种情况下的问题是我不能(或者我可以?)在 web api 路由中添加前缀 api,因为第三方设备正在使用固定 url 发送 GET 和 POST 请求,如下所示:

GET /iclock/cdata?SN=xxxxxx&options=all&pushver=2.0.2&language=XX
GET /iclock/cdata?SN=xxxxxx&type=time
POST /iclock/cdata?SN=123456&table=ATTLOG&Stamp=2011-04-05T17:40:20

我实现了上述请求处理功能,对 WebApiConfig 路由进行了更改。现在需要一个前端 UI,我正在为此开发一个带有 CRUD 操作的 MVC 控制器。

在这种情况下,理想的方法应该是什么?

【问题讨论】:

  • 除非 web api 控制器监听相同的路由,否则它不应该影响你的 mvc 控制器。

标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api


【解决方案1】:

可能是当您导航到 Test/Index 时,它不知道是应该使用有可选“id”的 web 路由还是没有“id”的 api 路由。如果可能的话,我会为您的 Web API 路由添加前缀,例如 MVC Web API 模板中描述的“api/{controller}/{action}”。

对于您的第二个示例,访问 API 的应用程序会简单地在 URL 前加上“api/”。如果他们使用的是您指定的 URL 并且无法更改,那么我认为您可能会卡住,因为当请求进来时,仍然存在不知道使用哪个路由的问题。

如果 URL 可以更改,如上所述,简单的前缀为“api/”。

编辑:根据提供的额外信息/code-sn-p 更新了我的答案。 编辑:再次更新

【讨论】:

  • 感谢更新的答案。是的,这些 url 被固定为使用这些固定 url 推送数据的第三方设备。考虑到 Web API 路由,我将修改我的 MVC 路由。
【解决方案2】:

您是否在WebApiConfig 中查看WebApiConfig 而不是RouteConfig App_Start

 public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }

【讨论】:

  • 请看我的更新,自定义路由和webapi路由冲突吗?
【解决方案3】:

您的路由表中存在冲突。您的 Web API 路由表现在与您的标准 MVC 路由表相同。您的 Web API 路由表(使用 MapHttpRoute 初始化的路由表应声明为:routeTemplate: "api/{controller}/{id}"。此外,您不应该修改 Web API 路由。它必须是 api/{controller}/{id} 并不是一成不变的,但是您应该遵循某个约定。尝试将您的路线重置为如下所示,然后重试:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

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

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

所以,首先重置为正常的路由配置并进行测试。之后慢慢做出改变并遵循结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 2012-09-24
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多