ASP.NET MVC`Html.ActionLink`在"区域"之间

jcv*_*dan 48 asp.net-mvc asp.net-mvc-areas razor

我已经为我的MVC3项目添加了一个新区域,我正在尝试从_Layout页面链接到新区域.我添加了一个名为"Admin"的区域,它有一个控制器"Meets".

我使用visual studio designer添加区域,因此它具有正确的区域注册类等,global.asax文件正在注册所有区域.

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

@Html.ActionLink("Admin", "Index", "Meets", new { area = "Admin" }, null)
@Html.ActionLink("Admin", "Index", "Meets", new { area = "" }, null)
Run Code Online (Sandbox Code Playgroud)

单击这两个链接时,我将被带到管理区域中的Meets控制器,然后应用程序继续发出错误,指出它无法找到索引页面(即使索引页面存在于区域子视图文件夹中 - 目录.

第一个链接的href如下所示:

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

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

http://localhost/BCC/Meets

此外,如果我点击我希望创建的链接:

http://localhost/BCC/Admin/Meets

我只是得到一个资源无法找到错误.一切都非常令人困惑!我希望有人能帮帮忙...

Dar*_*rov 73

确实很奇怪.对我来说非常好的步骤:

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

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

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

    @Html.ActionLink("Admin", "Index", "Meets", new { area = "Admin" }, null)
    @Html.ActionLink("Admin", "Index", "Meets", new { area = "" }, null)
    
    Run Code Online (Sandbox Code Playgroud)
  6. 运行该应用程序.

为锚点呈现的HTML:

<a href="/Admin/Meets">Admin</a>
<a href="/Meets">Admin</a>
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,第一个链接有效,而第二个链接无效

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


Sha*_*son 30

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

ActionLink版本:

Html.ActionLink("Log Off", "LogOff", "Account", new { area = "" }, null)
Run Code Online (Sandbox Code Playgroud)

RouteLink版本:

Html.RouteLink("Log Off", "Default", 
    new { action = "LogOff", controller = "Account" })
Run Code Online (Sandbox Code Playgroud)

第二个参数是"路径名称",它在Global.asax.cs和各种"AreaRegistration"子类中注册.要使用"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" })
Run Code Online (Sandbox Code Playgroud)

快乐的编码!


jcv*_*dan 7

我想出了这个 - 我创建了一个新的测试项目并完成了我以前做的完全相同的事情并且它起作用了......然后在进一步检查两个项目之间的路径相关的所有事情后,我发现了一个差异.

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

正如你可以看到我的评论在哪里,在某个时间或其他地方我已经在RegisterRoutes的开头放置了routes.Clear()调用,这意味着在我注册了Application_Start中的区域之后,我立即清除了我刚才的内容注册.

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