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 未使用默认设置调用控制器操作“索引”_Asp.net Mvc_Asp.net Mvc 4_Asp.net Web Api - Fatal编程技术网

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

Asp.net mvc 未使用默认设置调用控制器操作“索引”,asp.net-mvc,asp.net-mvc-4,asp.net-web-api,Asp.net Mvc,Asp.net Mvc 4,Asp.net Web Api,我有一个ASP.NET web应用程序项目,我实现了一个WebApi控制器,现在开始使用MVC控制器 我添加了一个新的MVC控制器,例如Test,并选择使用空读写操作添加它 控制器是使用各种CRUD方法创建的,但是索引操作的行为异常 默认情况下,索引操作不接受任何参数: public ActionResult Index() { return View(); } 现在,如果我尝试使用url/Test/Index调用此方法,则不会调用该方法 但是如果我输入url/Test/Index/1

我有一个ASP.NET web应用程序项目,我实现了一个WebApi控制器,现在开始使用MVC控制器

我添加了一个新的MVC控制器,例如Test,并选择使用空读写操作添加它

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

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

public ActionResult Index()
{
    return View();
}
现在,如果我尝试使用url/Test/Index调用此方法,则不会调用该方法

但是如果我输入url/Test/Index/1,索引操作就会运行

在我看来,它与路由相关,所以我检查了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设置为可选,我的理解是不应该要求我在索引方法中提供参数值

我创建了另一个项目并检查了这个行为,它运行良好

所以想知道在这个项目中,是什么让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:

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

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控制器

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

您是否在应用程序启动中查看WebApiConfig而不是RouteConfig

您是否查看了应用程序启动中的WebApiConfig而不是RouteConfig


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

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

如前所述,如果URL可以更改,请使用api/的简单前缀

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

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

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

如前所述,如果URL可以更改,请使用api/的简单前缀

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

您的路由表中存在冲突。您的Web API路由表现在与标准MVC路由表相同。使用MapHttpRoute初始化的Web API路由表应声明为: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 }
        );
    }
}

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

您的路由表中存在冲突。您的Web API路由表现在与标准MVC路由表相同。使用MapHttpRoute初始化的Web API路由表应声明为: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 }
        );
    }
}

因此,首先重置为正常路由配置并进行测试。之后,缓慢地进行更改并跟踪结果。

除非web api控制器在同一路由上侦听,否则它不应影响您的mvc控制器。除非web api控制器在同一路由上侦听,否则它不应影响您的mvc控制器
滚轴。请查看我的更新,自定义路由是否与webapi路由冲突?请查看我的更新,自定义路由是否与webapi路由冲突?谢谢更新的答案。是的,URL被固定为第三方设备,使用这些固定URL推送数据。我将根据web API路由修改我的MVC路由。谢谢更新的答案。是的,URL被固定为第三方设备,使用这些固定URL推送数据。我将修改我的MVC路由,考虑web API路由。