Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.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# MVC中的路由问题_C#_Asp.net Mvc_Asp.net Mvc Routing - Fatal编程技术网

C# MVC中的路由问题

C# MVC中的路由问题,c#,asp.net-mvc,asp.net-mvc-routing,C#,Asp.net Mvc,Asp.net Mvc Routing,在阅读了所有文档之后,我认为我至少有一个理解MVC中路由的基础,但在尝试使用它时却失败了 我在my Global.aspx中声明了以下两条路线 routes.MapRoute( "", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Admin", action = "List", id = UrlParameter.Optional } // P

在阅读了所有文档之后,我认为我至少有一个理解MVC中路由的基础,但在尝试使用它时却失败了

我在my Global.aspx中声明了以下两条路线

routes.MapRoute(
    "", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Admin", action = "List", id = UrlParameter.Optional } // Parameter defaults
);

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
我有一个AdminController,我有几个方法,一个是“列表”方法,它将产品列表呈现到“列表”视图

我想我了解RedirectToAction是如何工作的,我添加了一个“Add”方法(见下文),该方法添加了一个新产品并返回一个RedirectToAction,我认为这是在同一个“AdminController”上重定向到列表操作的正确方法

但是,在返回“Add”时,它总是尝试路由到路径
website.com/Account/Login/ReturnUrl=%2f

但是,如果我访问website.com/Admin,它会按照我的预期呈现列表。但当使用上述示例中的RedirectToAction时,它会尝试转到
/Account/Login
(控制器/操作)

据我所知,RedirectToAction(“List”、“Admin”)将路由到AdminController上的“List”方法,我正在按预期使用它

有人能帮我理解这背后的原因吗。但是,也有人可以发布一些推荐文章来了解整个MVC路由,包括web.config如何处理路由


最后,据我所知,框架的路由发现是按照routes.MapRoute()声明中指定的顺序进行的,并在第一个匹配的位置停止。因此,如果第一个列为Controller=“Admin”、Action=“List”,按照惯例,我希望这是它将首先匹配并返回的正确路由。

您的路由需要不同(url参数),因为将使用具有匹配url的第一个路由

因此,这将适用于您:

routes.MapRoute("Admin", 
    "admin/{action}/{id}", 
    new { controller = "Admin", action = "List", id = UrlParameter.Optional });
如果在uri中未找到/指定参数,则使用默认值(方法中的第三个参数)


至于您关于
/Account/Login/ReturnUrl=%2f
的问题。登录重定向由
会员资格提供商处理,而不是由标准路由机制处理。

Thx。我将把这标记为一个答案。然而,我仍然不理解为什么调用RedirectToAction(“List”、“Admin”)不能正确解析到第一个列出的路由(我已经指定)。此外,我知道您提到了MembershipProvider,但这是如何混合的呢?
/Account/Login/ReturnUrl=%2f
是一个url,用于在用户未经身份验证的情况下形成身份验证。当您将路线更改为我建议的路线时,
RedirecToAction
应该可以工作。是吗?是的。当我把它改成你的建议时,它确实起作用了。但我仍然不明白,为什么在调用RedirectToAction(“List”、“Admin”)时,controller=Admin,action=List的第一个路由{controller}/{action}/{id}没有被选中,而RedirectToAction(“List”、“Admin”)指定的是完全相同的控制器和操作。你说没有被选中是什么意思?selected=就像“selected”的路由集合中的路由一样作为要使用的路线。{controller}/{action}/{id}基本上是MVC默认值的一个副本,它作为“一网打尽”,我只更改了控制器和操作默认值。因此,如果我调用RedirectToAction(“List”、“Admin”),我是在显式地声明“发送到AdminController上的List操作”,因此当它按照指定的顺序通过定义的路由时,它应该到达我的第一个路由并说“我有一个匹配项”,然后指向“AdminController”上的“List”方法。对吗?
routes.MapRoute("Admin", 
    "admin/{action}/{id}", 
    new { controller = "Admin", action = "List", id = UrlParameter.Optional });