ASP.Net MVC@Url.Action()路由到错误的控制器
本文关键字:错误 控制器 路由 Net MVC@Url Action ASP | 更新日期: 2023-09-27 18:19:34
我是MVC的新手。我可以将MVC 5.2集成到我现有的web表单Visual Studio 2012 Update 4项目中。我创建了我的第一个控制器,一切都如预期。甚至我在访问MVC视图时也能够利用现有项目中的windows表单身份验证。但当我创建第二个控制器时,它开始出现问题。
这是我的路线图:
public static class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.EnableFriendlyUrls();
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
我有两个控制器,都位于~/控制器中。我的第一个控制器是:
public class HomeController : Controller
{
//
// GET: /Home/
public ActionResult Index()
{
//return View();
return Redirect("~/Default.aspx");
}
public ActionResult CloseSession()
{
return Redirect("http://www.yahoo.com");
}
}
第二个控制器:
public class CajaWebController : Controller
{
//
// GET: /CajaWeb/
public ActionResult Index()
{
return View();
}
public ActionResult CloseSession()
{
return Redirect("http://www.cnn.com");
}
}
我不知道它是否与这个问题相关,但我将介绍如何实现MVC视图。我的VS2012起始url是
http://localhost/Fortia/CajaWeb.
Fortia是我的应用程序名称。因为我声明了Web表单身份验证和
<location path="CajaWeb">
<system.web>
<authorization>
<allow roles="Fortia" />
<deny users="*" />
</authorization>
</system.web>
</location>
当开始调试旧的WebForms应用程序身份验证机制时,调用旧的WebForm登录页面,在成功登录后,最终调用我的CajaWebController,Index()操作。在创建CajaWebController之前,调用的是HomeController,但我认为MVC现在推断出正确的控制器是CajaWeb,因为目标url是
http://localhost/Fortia/CajaWeb.
调用的视图包含以下代码:
<a href='@Url.Action("CloseSession", "CajaWeb")'>Close session</a>
问题是,当单击生成的链接时,MVC调用HomeController.Index()操作,尽管我在@Url.action…中明确设置了CajaWebController.CloseSession()
我查看了生成的链接,它看起来是错误的:
<a href='/Fortia/__FriendlyUrls_SwitchView?action=CloseSession&controller=CajaWeb'>
它对参数分隔符&进入&但不管怎样,我试着将href手动编码为
http://localhost/Fortia/__FriendlyUrls_SwitchView?action=CloseSession&controller=CajaWeb
但结果是一样的。
怎么了?
您使用的ASP.NET Friendly Urls包似乎干扰了MVC生成的URL。不管怎样,这个库似乎是为WebForms设计的
如果它不起作用,那么就这样吧,因为当控制器和操作名称对其内容有意义时,MVC的URL已经非常适合SEO了。
我认为问题在于路由
http://localhost/Fortia/CajaWeb
与任何路由都不匹配,因此它最终会转到RouteConfig中指定的默认路由。您需要在应用程序中配置一条路线或创建一个名为"Fortia"的区域。