【问题标题】:ASP.Net MVC @Url.Action() routing to the wrong controllerASP.Net MVC @Url.Action() 路由到错误的控制器
【发布时间】:2014-10-21 08:54:38
【问题描述】:

我是 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 }
        );
    }
}

我有两个控制器都位于 ~/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");
    }
}

第二个控制器:

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

    public ActionResult CloseSession()
    {
        return Redirect("http://www.cnn.com");
    }
}

我不知道它是否与问题相关,但我将介绍如何到达 MVC 视图。我的 VS2012 开始网址是

http://localhost/Fortia/CajaWeb. 

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

<location path="CajaWeb">
  <system.web>
    <authorization>
      <allow roles="Fortia" />
      <deny users="*" />
    </authorization>
  </system.web>
</location>

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

http://localhost/Fortia/CajaWeb. 

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

<a href='@Url.Action("CloseSession", "CajaWeb")'>Close session</a>

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

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

<a href='/Fortia/__FriendlyUrls_SwitchView?action=CloseSession&amp;controller=CajaWeb'>

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

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

但结果是一样的。

怎么了?

【问题讨论】:

标签: c# asp.net asp.net-mvc visual-studio-2012 asp.net-mvc-5


【解决方案1】:

我认为问题在于路线

http://localhost/Fortia/CajaWeb

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

【讨论】:

    【解决方案2】:

    您使用的ASP.NET Friendly Urls package 似乎干扰了 MVC 正在生成的 url。 The library seems to be meant for WebForms anyway

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

    【讨论】:

    • 我无法卸载 Friendly Urls 包,因为我正在更新的应用程序是 WebForms 并且严重依赖此包。我只是想向它添加 MVC 支持。所以我会看看如何忍受它。但这将是另一个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 2011-12-17
    • 2012-04-11
    • 2014-09-12
    • 2013-09-29
    相关资源
    最近更新 更多