2014-08-27 109 views
6

我是新手到MVC。我可以将MVC 5.2集成到我现有的Web窗体Visual Studio 2012 Update 4项目中。我创建了我的第一个控制器,并按预期工作。即使我能够在访问MVC视图时利用现有项目中的窗体身份验证。但是当创建我的第二个控制器时,它开始搞乱了。ASP.Net MVC @ Url.Action()路由到错误的控制器

这是我的路由映射:

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开始网址是

http://localhost/Fortia/CajaWeb. 

Fortia是我的应用程序名称。因为我宣布Web窗体身份验证和

<location path="CajaWeb"> 
    <system.web> 
    <authorization> 
     <allow roles="Fortia" /> 
     <deny users="*" /> 
    </authorization> 
    </system.web> 
</location> 
开始调试旧的WebForms应用程序的认证机制时

叫,老WebForms的登录页面调用和行动被称为成功登录终于我CajaWebController,指数()之后。创建CajaWebController是谁被称为HomeController的,但我认为MVC现在推导出正确的控制器之前,是因为有针对性的网址是

http://localhost/Fortia/CajaWeb. 

的调用视图包含以下代码的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'> 

它编码的参数分隔符&为&但无论如何,我想handcoding在href作为

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

,但结果是一样的。

出了什么问题?

+1

[不要使用web.config来锁定MVC授权的路径,它很可能不会工作,并肯定会允许安全漏洞](http://stackoverflow.com/questions/11765030/how-tolock -down-paths-in-asp-net-mvc) – 2014-08-27 17:02:26

+0

与论坛网站不同,我们不使用“谢谢”或“任何帮助表示赞赏”,或在[so]上签名。请参阅“[应该'嗨','谢谢',标语和致敬从帖子中删除?](http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be – 2014-08-27 17:02:30

+0

也许你似乎用于WebForms的包[ASP.NET Friendly URLs](http://aspnetfriendlyurls.codeplex.com/)与MVC不能很好地兼容? – CodeCaster 2014-08-27 17:05:50

回答

0

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

如果它没有工作,那就留下来吧,因为当控制器和动作名称对他们的内容有意义时,MVC的URL已经非常适合搜索引擎优化。

+0

我无法卸载Friendly Urls软件包,因为我正在更新的应用程序是WebForms,并且严重依赖于此软件包。我只是试图添加MVC支持。所以我会看看如何接受它。但这将是另一个问题(S) – sammybar 2014-08-28 00:14:44

0

我认为这个问题是这样它最终将在RouteConfig指定的默认路由的路由

http://localhost/Fortia/CajaWeb

不匹配任何路线。您需要配置路线或在您的应用程序中创建一个名为“Fortia”的区域。