“区域”之间的ASP.NET MVC`Html.ActionLink`

我已经添加了一个新的区域到我的MVC3项目,我试图从_Layout页面链接到新的区域。 我添加了一个名为“Admin”的区域,其中有一个控制器“Meets”。

我使用了视觉工作室devise师来添加区域,使其具有正确的区域注册类等,并且global.asax文件正在注册所有区域。

但是,当我在根的页面中使用以下两个操作链接时,遇到了一些问题:

@Html.ActionLink("Admin", "Index", "Meets", new { area = "Admin" }, null) @Html.ActionLink("Admin", "Index", "Meets", new { area = "" }, null) 

当点击两个链接时,我被带到pipe理区域的Meets控制器,然后应用程序继续抛出一个错误,指出它找不到索引页面(即使索引页面出现在区域子视图的Views文件夹中,目录。

第一个链接的href看起来像这样:

http://localhost/BCC/Meets?area=Admin

而第二个链接的href看起来像这样:

http://localhost/BCC/Meets

另外,如果我点击了我期望创build的链接:

http://localhost/BCC/Admin/Meets

我只是得到一个资源无法find的错误。 所有非常复杂! 我希望有人能帮帮忙…

奇怪的确如此。 对我来说工作得很好的步骤是:

  1. 使用默认的Visual Studio模板创build一个新的ASP.NET MVC 3应用程序
  2. 右击项目,添加一个名为Admin的区域,使用Visual Studiodevise器
  3. ~/Areas/Admin/Controllers/MeetsController添加新的控制器:

     public class MeetsController : Controller { public ActionResult Index() { return View(); } } 
  4. 添加相应的视图~/Areas/Admin/Views/Meets/Index.cshtml

  5. 在布局( ~/Views/Shared/_Layout.cshtml )中添加链接:

     @Html.ActionLink("Admin", "Index", "Meets", new { area = "Admin" }, null) @Html.ActionLink("Admin", "Index", "Meets", new { area = "" }, null) 
  6. 运行应用程序。

渲染锚点的HTML:

 <a href="/Admin/Meets">Admin</a> <a href="/Meets">Admin</a> 

如预期的那样,第一个链接工作,而第二个链接没有。

那么你的设置有什么不同?

另一个select是利用RouteLink()而不是ActionLink(),它完全绕过区域注册:

ActionLink版本:

 Html.ActionLink("Log Off", "LogOff", "Account", new { area = "" }, null) 

RouteLink版本:

 Html.RouteLink("Log Off", "Default", new { action = "LogOff", controller = "Account" }) 

第二个参数是在“Global.asax.cs”和各种“AreaRegistration”子类中注册的“Route Name”。 要使用“RouteLink”链接不同区域,只需要指定正确的路由名称。

下面的例子显示了我将如何从共享部分生成三个不同区域的链接,无论我处于哪个区域(如果有的话),它都能正常工作:

 @Html.RouteLink("Blog", "Blog_default", new { action = "Index", controller = "Article" }) <br/> @Html.RouteLink("Downloads", "Download_default", new { action = "Index", controller = "Download" }) <br/> @Html.RouteLink("About", "Default", new { action = "Index", controller = "About" }) 

快乐的编码!

我想到了这一点 – 我创build了一个新的testing项目,做了和我以前一样的工作,然后工作…然后,在进一步检查了两个项目之间所有与path有关的事情之后,我发现了一个差异。

在我的BCC应用程序中的global.asax文件中,出现了一系列令人费解的代码,

  public static void RegisterRoutes(RouteCollection routes) { // Problem here routes.Clear(); routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults ); } protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); } 

正如你可以看到我的评论在哪里,在某个时间或其他我已经放置的路线.Clear()调用RegisterRoutes的开始,这意味着我已经在Application_Start注册的地区后,我立即清理我刚才注册。

谢谢你的帮助……它最终导致了我的救赎!

validation您的AdminAreaRegistration类如下所示:

 public class AdminAreaRegistration : AreaRegistration { public override string AreaName { get { return "Admin"; } } public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Admin_default", "Admin/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional } ); } } 

并且你在Global.asax.cs有这个:

 protected void Application_Start() { ... // ViewEngine Registration AreaRegistration.RegisterAllAreas(); ... // Other route registration } 

我通过下面的方法解决了这个问题。

在我的Global.asax.cs中,我有

  public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); } public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" }); } protected void Application_Start() { //Initialise IoC IoC.Initialise(); AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); } 

在我的PublicAreaRegistration.cs(公共区域),我有

 public class PublicAreaRegistration : AreaRegistration { public override string AreaName { get { return "Public"; } } public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute("Root", "", new { controller = "Home", action = "Index" }); context.MapRoute( "Public_default", "Public/{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional } , new[] { "<Project Namespace here>.Areas.Public.Controllers" } ); } } 

在我的AuthAreaRegistration.cs(限制访问区),我已经得到了

 public class AuthAreaRegistration : AreaRegistration { public override string AreaName { get { return "Auth"; } } public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Auth_default", "Auth/{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } } 

最后,我的* .cshtml页面中的链接就像

1)@ Html.ActionLink(“注销”,“注销”,新的{区域=“公共”,控制器=“家”))

要么

2)@ Html.ActionLink(“Admin Area”,“Index”,new {area =“Auth”,controller =“Home”})

希望这可以节省一些小时的研究! 顺便说一下,我在这里谈论MVC3。

Kwex。

对于大多数开发人员来说,情况可能不是这样,但是当我添加了我的第一个区域并且没有构build我的解决scheme时,我遇到了这个问题。 只要我build立我的解决scheme的链接开始正确填充。