Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.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
C# 使用RouteConfig更改路径后,旧路径不起作用_C#_Asp.net Mvc - Fatal编程技术网

C# 使用RouteConfig更改路径后,旧路径不起作用

C# 使用RouteConfig更改路径后,旧路径不起作用,c#,asp.net-mvc,C#,Asp.net Mvc,我正在从事一个带有实体框架的C#ASP.NET MVC项目 我正在尝试使用RouteConfig.cs 首先,代码是这样的 public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute(

我正在从事一个带有实体框架的C#ASP.NET MVC项目

我正在尝试使用
RouteConfig.cs

首先,代码是这样的

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 = "Account", action = "Login", id = UrlParameter.Optional }
        );
    }
}

我想把url
localhost/Customer/Index
转换成
localhost/Index

所以我添加了这一行代码,它成功了

routes.MapRoute(
    name: "customer",
    url: "customer",
    defaults: new { controller = "Customer", action = "Index"}
);
接下来,我尝试将
localhost/Customer/Details/2
更改为
localhost/CustomerName/2

// CustomerName varies with each customer
所以我加了这个

 routes.MapRoute(
     name: "customerDetail",
     url: "customer/{name}/{id}",
     defaults: new { controller = "Customer", action = "Details", id = UrlParameter.Optional, name = UrlParameter.Optional }
);
现在,客户详细信息页面已正确加载


但是,使用此路径加载索引页会导致错误,
localhost/Customer/Index
,而
localhost/Customer
不会导致错误。为什么会这样

编辑

这就是我的
RouteConfig
的样子

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

        routes.MapRoute(
            name: "customer",
            url: "customer",
            defaults: new { controller = "Customer", action = "Index"}
        );
        routes.MapRoute(
            name: "customerDetail",
            url: "customer/{name}/{id}",
            defaults: new { controller = "Customer", action = "Details", id = UrlParameter.Optional, name = UrlParameter.Optional }
        );

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

最后我找到了答案

正如@StephenMuecke所评论的那样


localhost/Customer/Index
匹配
customerDetail
路由(并将
“Index”
传递给id参数)

因此,我重新检查了我的代码,发现
localhost/Customer/Details/2
中的
id
字段不是可选的,我意外地将其定义为可选的,
id=UrlParameter.optional

 routes.MapRoute(
        name: "customerDetail",
        url: "customer/{name}/{id}",
        defaults: new { controller = "Customer", action = "Details", name = UrlParameter.Optional }
    );
完整路由配置代码:

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

        routes.MapRoute(
            name: "customer",
            url: "customer",
            defaults: new { controller = "Customer", action = "Index"}
        );
        routes.MapRoute(
            name: "customerDetail",
            url: "customer/{name}/{id}",
            defaults: new { controller = "Customer", action = "Details",name = UrlParameter.Optional }
    );

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

    }
}

请尝试以下代码。从现有代码中删除
id
作为
UrlParameter。可选

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

    routes.MapRoute(
        name: "customer",
        url: "customer",
        defaults: new { controller = "Customer", action = "Index"}
    );
    routes.MapRoute(
        name: "customerDetail",
        url: "customer/{name}/{id}",
        defaults: new { controller = "Customer", action = "Details", name = UrlParameter.Optional } // Removed idas optional from existing code
    );

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

   }
}

添加路线的顺序很重要。更改后按当前状态显示RouteConfig。您可能遇到路由冲突。似乎您在
RouteConfig
中定义了错误的路由顺序。最具体的路由应该位于更广泛/默认路由之上。您的第二个路由不生成
localhost/Index
-它生成
localhost/customer
,并且只有最后一个参数可以标记为
UrlParameter。可选的
localhost/customer/Index
匹配
customerDetail
路由(并通过“索引”到
id
参数)