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

sam*_*bar 6 c# asp.net asp.net-mvc visual-studio-2012 asp.net-mvc-5

我是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 }
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

我有两个控制器都位于〜/ Controllers中.我的第一个控制器是:

public class HomeController : Controller
{
    //
    // GET: /Home/
    public ActionResult Index()
    {
        //return View();
        return Redirect("~/Default.aspx");
    }

    public ActionResult CloseSession()
    {
        return Redirect("http://www.yahoo.com");
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个控制器:

public class CajaWebController : Controller
{
    //
    // GET: /CajaWeb/
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult CloseSession()
    {
        return Redirect("http://www.cnn.com");
    }
}
Run Code Online (Sandbox Code Playgroud)

我不知道它与问题有关,但我将包括如何达到MVC视图.我的VS2012启动网址是

http://localhost/Fortia/CajaWeb. 
Run Code Online (Sandbox Code Playgroud)

Fortia是我的应用名称.因为我声明了Web Forms身份验证和

<location path="CajaWeb">
  <system.web>
    <authorization>
      <allow roles="Fortia" />
      <deny users="*" />
    </authorization>
  </system.web>
</location>
Run Code Online (Sandbox Code Playgroud)

当开始调试时,调用旧的WebForms应用程序身份验证机制,调用旧的WebForms登录页面,并在成功登录后最终调用我的CajaWebController,Index()动作.在创建CajaWebController之前,它是被调用的HomeController,但我认为MVC现在推断出正确的控制器是CajaWeb,因为目标url是

http://localhost/Fortia/CajaWeb. 
Run Code Online (Sandbox Code Playgroud)

调用的视图包含以下代码:

<a href='@Url.Action("CloseSession", "CajaWeb")'>Close session</a>
Run Code Online (Sandbox Code Playgroud)

问题是当单击生成的链接时,MVC调用HomeController.Index()操作,尽管我在@ Url.Action中明确设置了CajaWebController.CloseSession()...

我查看了生成的链接,看起来不对劲:

<a href='/Fortia/__FriendlyUrls_SwitchView?action=CloseSession&amp;controller=CajaWeb'>
Run Code Online (Sandbox Code Playgroud)

它编码参数分隔符并进入&但无论如何我尝试将href手动编码为

http://localhost/Fortia/__FriendlyUrls_SwitchView?action=CloseSession&controller=CajaWeb 
Run Code Online (Sandbox Code Playgroud)

但结果是一样的.

怎么了?

Cod*_*ter 0

您正在使用的ASP.NET 友好 URL 包似乎干扰了 MVC 生成的 url。无论如何,这个库似乎是为 WebForms 设计的

如果没有它也可以工作,那么就保持原样,因为当控制器和操作名称对其内容有意义时,MVC 的 url 已经非常适合 SEO。