1

我有一个 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 控制器。

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

4

3 回答 3

3

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

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

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

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

于 2013-05-20T19:25:11.407 回答
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 }
        );
    }
于 2013-05-20T15:25:17.410 回答
1

You have a conflict in your routing table. Your Web API routing table is now the same as your standard MVC routing table. Your Web API routing table (the one that is initialized with MapHttpRoute should be declared as: routeTemplate: "api/{controller}/{id}". Also, you shouldn't have modified the Web API route. It is not cast in stone that it must be api/{controller}/{id}, but there is a certain convention that you should follow. Try reseting your routes to be like the following and then try again:

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

So, first reset to normal routing configuration and test. After that make changes slowly and follow the result.

于 2013-05-21T19:03:02.637 回答