“区域”之间的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的错误。 所有非常复杂! 我希望有人能帮帮忙…
奇怪的确如此。 对我来说工作得很好的步骤是:
- 使用默认的Visual Studio模板创build一个新的ASP.NET MVC 3应用程序
- 右击项目,添加一个名为
Admin
的区域,使用Visual Studiodevise器 -
在
~/Areas/Admin/Controllers/MeetsController
添加新的控制器:public class MeetsController : Controller { public ActionResult Index() { return View(); } }
-
添加相应的视图
~/Areas/Admin/Views/Meets/Index.cshtml
-
在布局(
~/Views/Shared/_Layout.cshtml
)中添加链接:@Html.ActionLink("Admin", "Index", "Meets", new { area = "Admin" }, null) @Html.ActionLink("Admin", "Index", "Meets", new { area = "" }, null)
- 运行应用程序。
渲染锚点的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的链接开始正确填充。
- 使用xcodebuild构build超时等待<IDEWorkspace,0x2004cebc0> /“runContextManager.runContexts”
- 如何将自定义图像应用于android中的checkbox
- 处理CORS预检请求到ASP.NET MVC操作
- ViewData和TempData的区别?
- ASP.NET MVC剃刀devise师
- Html.Label,Html.LabelFor和Html.LabelForModel有什么区别
- Razor MVC使用Model Array填充Javascript数组
- 在MVC 2中将CSS类添加到Html.EditorFor
- AllowAnonymous不能使用Custom AuthorizationAttribute
- 在哪里把视图特定的JavaScript文件在ASP.NET MVC应用程序?
- 在Windows Update之后,System.Web.Mvc无法正常工作