gpt4 book ai didi

asp.net-mvc-routing - ASP.NET MVC 区域 : How to hide "Area" name in URL?

转载 作者:行者123 更新时间:2023-12-03 00:37:12 24 4
gpt4 key购买 nike

运行 MVC 2 Areas example 时具有博客区域和博客 Controller 的 URL 如下所示:

http://localhost:50526/Blog/Blog/ShowRecent格式为:

RootUrl/区域名称/ Controller 名称/操作名称

刚刚发现 MVC 区域,这似乎是组织代码的好方法,即为每个部分创建一个区域,在我的例子中,每个部分都有自己的 Controller 。这意味着每个 AreaName = ControllerName。其效果是 Url 中的双 AreaName/ControllerName 路径,例如上面的 /Blog/Blog/

对路由没有完全清晰的了解,如何设置路由不显示区域名称?

编辑:

我正在尝试减少路由的工作量,因为这些路由似乎会相互影响(即需要特定的排序),并且可能会引起严重的头痛:-)在将现有的 Webform 应用程序转换为 MVC 时,我已经转换了几个核心部分,每个部分都有一个 Controller 和相当数量的 View /操作,尽管大多数数据访问代码都在程序集中,但模型/ View 数据类的数量正在增长......我目前正在根目录中创建子文件夹这些部分(或区域)的模型/ View 文件夹,并希望创建区域能够以相同的方式工作,除了组织代码(使用覆盖该区域的基本路线)对此有何评论?

最佳答案

在每个区域的文件夹内,您将看到一个 *AreaName*AreaRegistration.cs 文件。这是存储区域路由规则的位置。默认情况下,在生成它们时,它们将在其他所有内容之前包含区域名称。问题是:如果从 route 删除区域名称“文件夹”,路线将捕获所有“标准”{controller}/{操作}/{id} 请求。这显然不是你想要的..

要克服这个问题,您可以根据该路由中存在的 Controller 名称在路由上添加正则表达式过滤器。缺点是什么?您将无法在应用程序中拥有两个同名的 Controller (至少不能使用标准路线。您总是可以想出不同的路线来访问它们:))

最后..具有这样的结构:

/Areas
/Areas/Blog/Controllers/BlogController.cs
/Areas/Blog/Controllers/FeedController.cs
/Areas/User/Controllers/UserController.cs
/Controllers/PageController.cs

你应该拥有的是这样的:在 BlogAreaRegistration.cs 中:

context.MapRoute(
"Blog_default",
"{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional },
new { controller = "(Blog|Feed)" }
);

在 UserAreaRegistration.cs 中:

context.MapRoute(
"User_default",
"{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional },
new { controller = "(User)" }
);

在 Global.asax.cs 中:

public static void RegisterRoutes(RouteCollection routes)
{
context.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();

RegisterRoutes(RouteTable.Routes);
}

请注意,在 global.asax 区域中,注册是第一位的! :)

UPD:根据您的问题更新:如果您要使用区域,您必须考虑一件重要的事情:如果您有区域间链接,则还必须在链接中提供区域名称。例如

<%: Html.ActionLink("Link text", "Action", "Controller", new { area = "Blog", id = 4, title = "page-title" }); %>

你明白了。

关于多个模型/ View ,目前我正在遵循这样的结构

/Code/ // helper, extension classes that aren't moved to libraries
/Models/Data/ // The EF classes + validation classes are here
/Models/ViewModels/{controller}/ // view models stored per controller

到目前为止,它运行良好,并且我设法使解决方案保持相对有序。正如我所说,到目前为止我创建的唯一区域是Admin 区域,因为它与网站的其他部分有很大不同:)

关于asp.net-mvc-routing - ASP.NET MVC 区域 : How to hide "Area" name in URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2682170/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com