我有一个ASP.NET MVC4应用程序,我在其中创建多个区域,有没有一种方法可以通过编程方式找出存在的区域数量及其名称.
我尝试使用单独项目中的区域创建简单的概念验证ASP.NET MVC 4网站.
我尝试按照教程:http://bob.archer.net/content/aspnet-mvc3-areas-separate-projects(应用程序在虚拟目录中不起作用......我使用IIS).我希望有比虚拟目录更好的方法.
然后我尝试了这个教程:http: //forums.asp.net/t/1483660.aspx/1但是在区域项目的*.csproj中没有"AreasManifestDir"元素(并且得到错误"视图'索引'或其未找到master或视图引擎没有支持搜索的位置")
ASP.NET中是否仍然支持MVC 4?因为我发现这个答案可以在将来删除: 作为单个项目实现的区域与asp.net mvc中的多个项目有什么优缺点
我还没有找到任何关于MVC4的方法.
解决方案的结构很简单:
Solution 'MvcAreasMultiProject'
Areas [Directory]
Admin [Project]
Models
Views
Controllers
Routes.cs [Examples]
MvcAreasMultiProject [MainProject]
- References Admin project
M.V.C
Run Code Online (Sandbox Code Playgroud)
Admin项目的Routes.cs:
namespace Admin
{
public class Routes : AreaRegistration
{
public override string AreaName { get { return "Admin"; } }
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Admin_Default",
"Admin/{action}/{id}",
new { controller = "Admin", action = "Index", id = "" },
new[] { …Run Code Online (Sandbox Code Playgroud) 所以我刚刚更新了我的应用程序以使用ASP.NET Core RC2.我使用Visual Studio发布它并注意到我的区域未发布:
此快照来自src\MyProject\bin\Release\PublishOutput:
这是我Admin在Visual Studio中命名的区域:
我错过了一步还是什么?
运行具有博客区域和博客控制器的MVC 2区域示例时,URL如下所示:
http:// localhost:50526/Blog/Blog/ShowRecent格式:
RootUrl/AreaName/ControllerName/ActionName
刚刚发现了MVC区域,它似乎是一种组织代码的好方法,即为每个部分创建一个区域,在我的例子中每个区域都有自己的控制器.这意味着每个AreaName = ControllerName.这样做的结果是Url中的双AreaName/ControllerName路径,例如/ Blog/Blog /上面
没有完全清楚地了解路由,我如何设置路由以不显示AreaName?
编辑:
我试图减少路由的工作量,因为这些似乎相互影响(即需要特定的排序)并可能导致严重的头痛:-)在将现有的webform应用程序转换为MVC时,我已经转换了几个核心部分,它们各有一个Controller和相当数量的View/Actions,虽然大部分数据访问都是在程序集中,但Model/ViewData类的数量正在增长......我目前正在根模型/视图中创建子文件夹这些部分(或区域)的文件夹,并希望创建区域将以相同的方式工作,除了组织代码(使用覆盖区域的基本路线)任何评论?
我发现这个问题不能使用ASP.NET MVC 2中的区域的相对路径,这与我遇到的问题相同.在MVC3中仍然如此吗?
有没有办法将内容文件保存在相对于该区域的区域中?
这样一个区域中的布局文件可以有类似的东西
无需创建完全限定的链接,需要区域目录和区域名称或上述问题的解决方案,这需要检查每个请求的每个区域.
更新/编辑
我决定使用上面问题中的解决方案和下面的解决方案(html帮助程序) - 取决于项目/情况.我上面的实现使用app.setting来存储区域名称和扩展名,这样我就可以将模块作为我的库的一部分.
var context = HttpContext.Current;
var path = context.Request.Path;
var list = ... //code that gets from app.config and then saves it
var extensions = ... // to the cache as non-removable with a dependency on web.config
foreach (var area in list)
{
if (!path.Contains(area + "/")) continue;
foreach (var extension in extensions)
{
if (path.EndsWith("." + extension))
{
context.RewritePath(path.Replace(area + "/", "Areas/" + area + "/"));
}
} …Run Code Online (Sandbox Code Playgroud) 当我在Admin区域内并使用属性路由映射我的路线时,它找不到视图,因为它不会查看实际区域视图文件夹,而只查看全局视图文件夹.
只有当我通过完整路径查看它然后才能显示它,否则它会抛出我的错误.
错误
The view 'Authorize' or its master was not found or no view engine supports the searched locations. The following locations were searched:
~/Views/Home/Authorize.aspx
~/Views/Home/Authorize.ascx
~/Views/Shared/Authorize.aspx
~/Views/Shared/Authorize.ascx
~/Views/Home/Authorize.cshtml
~/Views/Home/Authorize.vbhtml
~/Views/Shared/Authorize.cshtml
~/Views/Shared/Authorize.vbhtml
Run Code Online (Sandbox Code Playgroud)
码
[RoutePrefix("admin")]
public class HomeController : Controller
{
[Route]
public ActionResult Index()
{
return View("Authorize"); // Error
return View("~/Areas/Admin/Views/Home/Authorize.cshtml"); // Working
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果我禁用属性路由并切换回旧的路由,它将起作用.有什么方法可以解决这个问题,或者它是按照预期的方式工作的,我应该在所有方面应用完整的路径?
c# asp.net-mvc asp.net-mvc-areas attributerouting asp.net-mvc-5
如何从我的某个区域链接到我的一个根控制器?
<% Html.RenderAction("Action", "Page", new {area = "root", name = "Admin"}); %>
Run Code Online (Sandbox Code Playgroud)
这给了我一个错误:
路由表中的路由与提供的值不匹配.
我有一个控制器命名在我的根控制器集合中命名Page的文件夹Admin中.我可以通过键入\ Admin\Page来访问此控制器.
这是我注册路线的方式:
routes.MapRoute(
"Admin",
"Admin/{controller}/{action}/{id}",
new { controller = "Admin", action = "Index", id = "" }
);
Run Code Online (Sandbox Code Playgroud)
我希望我可以在我的视图中使用此语法来解决"Admin"路由,但这不起作用.关于如何修复它的任何想法?
c# asp.net-mvc asp.net-mvc-routing asp.net-mvc-areas asp.net-mvc-2
我有一个基于ASP.NET MVC2 RC2构建的大型现有应用程序.
我的所有链接都是这样的:htp // site/controller/action/id
我刚刚添加了一个名为:BigBird的区域.
现在,当我在BigBird区域时,我的所有链接都是这样的:htp:// site/BigBird/controller/action/id
问题是我的新区域中没有这些控制器/操作.因此,我必须遍历我的应用程序中的所有actionlinks并将此routevalue:area = string.empty
有没有办法解决?
我有一个使用MVC区域的项目.该区域包含整个项目,而区域外的主"视图/控制器/模型"文件夹为空,禁止我设置的调度控制器将默认传入请求路由到我所在区域的Home Controller.
该控制器有如下方法: -
public ActionResult Index(string id)
{
return RedirectToAction("Index", "Home", new {area = "xyz"});
}
Run Code Online (Sandbox Code Playgroud)
我也有一个默认的路由设置来使用这个控制器如下: -
routes.MapRoute(
"Default", // Default route
"{controller}/{action}/{id}",
new { controller = "Dispatch", action = "Index", id = UrlParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
对我的站点的任何默认请求都适当地路由到相关区域.Area的"RegisterArea"方法只有一条路线: -
context.MapRoute(
"xyz_default",
"xyz/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
Run Code Online (Sandbox Code Playgroud)
我的区域有多个控制器,有很多视图.在这些控制器方法中对特定视图的任何调用,如"返回视图("blah");呈现正确的视图.但是,每当我尝试返回视图以及作为参数传入的模型对象时,我会收到以下错误: -
Server Error in '/DeveloperPortal' Application.
The view 'blah' or its master was not found. The following locations were searched:
~/Views/Profile/blah.aspx
~/Views/Profile/blah.ascx
~/Views/Shared/blah.aspx
~/Views/Shared/blah.ascx
Run Code Online (Sandbox Code Playgroud)
每当模型对象作为参数传入时,它看起来都像.到"View()"方法[例如返回View("blah",obj)]它在项目的根目录中而不是在区域特定的视图文件夹中搜索视图.
我在这里错过了什么?
提前致谢.
在单个项目解决方案中,当您拥有大量控制器时引入区域确实可以改善分离,并允许模块轻松地复制到解决方案中或从解决方案中复制出来.但是,在大型企业解决方案中,我倾向于将逻辑拆分为单独的项目.
因此具有单独的UI,Controller,SOA,Model和Repository项目.在这种情况下,区域不再有意义了,而且它们为Url添加了额外的顶层,这通常是不需要的,但我相信如果你保持控制器的独特性,你可以省略Url中的区域,但不是有点臭吗?
区域可能适用于中等复杂度的站点,或者模块代码更好地保存在一个位置,因此可以将其复制到其他站点或删除.