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&amp;controller=CajaWeb'>

它对参数分隔符&进入&但不管怎样,我试着将href手动编码为

http://localhost/Fortia/__FriendlyUrls_SwitchView?action=CloseSession&controller=CajaWeb 

但结果是一样的。

怎么了?

ASP.Net MVC@Url.Action()路由到错误的控制器

您使用的ASP.NET Friendly Urls包似乎干扰了MVC生成的URL。不管怎样,这个库似乎是为WebForms设计的

如果它不起作用,那么就这样吧,因为当控制器和操作名称对其内容有意义时,MVC的URL已经非常适合SEO了。

我认为问题在于路由

http://localhost/Fortia/CajaWeb

与任何路由都不匹配,因此它最终会转到RouteConfig中指定的默认路由。您需要在应用程序中配置一条路线或创建一个名为"Fortia"的区域。