控制器操作“索引”未使用默认设置调用

时间:2013-05-20 11:31:09

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

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

我添加了一个新的MVC控制器(例如“Test”)并选择将其添加为“空读写操作”。

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

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

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

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

但是,如果我输入网址“/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控制器。

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

3 个答案:

答案 0 :(得分:3)

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

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

如果可以更改URL,如上所述,使用“api /".

的简单前缀

编辑:根据提供的额外信息/代码段更新了我的答案。 编辑:再次更新

答案 1 :(得分:1)

您是否在WebApiConfig

中查看了RouteConfig而不是 App_Start
 public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }

答案 2 :(得分:1)

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

api/{controller}/{id}

因此,首先重置为正常路由配置并进行测试。之后,慢慢改变并遵循结果。