我正在开发一个新项目,我想使用Phil Haack Areas(1)idea + Steve Sanderson的调整(2).我有一个简单的根视图,其中包含一个视图区域(Foo)的动作链接.生成的URL具有适当的区域,但它在末尾附加根控制器(Bar).这是我的根视图代码:
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Index</h2>
<%= Html.ActionLink("Foo Index Page", "Index", new { area="Foo" } )%>
</asp:Content>
Run Code Online (Sandbox Code Playgroud)
这是它生成的URL:
本地主机:6494 /美孚/酒吧
知道为什么"/ Bar"在那里?
(1):haacked.com/archive/2008/11/04/areas-in-aspnetmvc.aspx
(2):blog.codeville.net/2008/11/05/app-areas-in-aspnet-mvc-take-2/
我正在搞乱ASP.NET MVC 2 Preview 2,并试图弄清楚路由如何与区域等一起工作.在区域的单个项目实现中,我想要一个名为"admin"的区域.
我想要能够拥有这样的网址:
(root)/admin/apples/search
(root)/admin/apples/edit/3
(root)/admin/apples/add
(root)/admin/oranges/search
(root)/admin/oranges/edit/5
(root)/admin/oranges/add
(root)/admin
Run Code Online (Sandbox Code Playgroud)
我创建了该区域.我用各自的视图创建了控制器,但这是我似乎无法获得的路由.关于如何实现这种路由的任何建议?
我相信这对某些人来说可能非常简单,但我没有太多运气来找到超越基本内容的例子.
谢谢!
问题的补充(2009年10月25日) 我基本上会问我在Area'RegionRegistration课程中设置的路线和顺序是什么?到目前为止,我已经做了所有提到的事情,但没有结果.
我目前正在尝试使用ASP.NET MVC 3 RC动态加载区域.我已经看到它写在许多地方,这不是那些区域的目的,并且(至少预MVC 2)不可能,例如在这里说.
但是还是!它应该可以让它工作,对吧?我创建了一个解决方案,添加了一个MVC 3项目,添加了一个区域和一些内容.一切都运作良好.现在我创建了一个新的类库项目(在同一个解决方案中),从MVC项目添加了对它的引用,并开始将与区域相关的部分移动到库中.将库项目的输出目录更改为MVC项目的area-folder,并确保将Views及其web.config复制到output-folder.
在阅读了很多关于你如何不能拥有外部区域之后,这有点令人惊讶.真的没问题!当我删除项目之间的引用,而不是在代码中加载库时,问题就开始了.(在打电话之前AreaRegistration.RegisterAllAreas().)现在它不起作用.完全没有.
我一直在寻找MVC 3的源代码,问题似乎BuildManager.GetReferencedAssemblies()是用于让程序集寻找实现AreaRegistration.
现在,我不是百分之百地确定这一点,但似乎这个方法只查看在编译时存在/引用的程序集,有人可以确认这是否实际上是这样的?
我通过这个调试了,而且方法调用确实没有找到我在调用它之前加载的程序集.这可能是因为我可能错过的其他东西......有什么想法吗?
我正在使用asp.net mvc 5和web api 2.对于asp.net mvc 5项目,我有一切正常工作......但新的我正在尝试添加web api 2路由...当我使用区域时.
我有web api 2控制器在项目根目录下工作:
//this is working
namespace EtracsWeb.Controllers
{
public class TestController : ApiController
{
//localhost:port/api/test ...this is working
[HttpGet]
public HttpResponseMessage Get()
{
return new HttpResponseMessage()
{
Content = new StringContent("GET: Test message")
};
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以我假设我Global.asax,我routeconfig.cs和我webapiconfig.cs的正确......(未显示)......
但是现在我想在我的AREAS工作中获得web api 2 ...
我已经阅读了我在网上找到的所有内容,这似乎应该可行:
namespace EtracsWeb.Areas.WorkOrder
{
public class WorkOrderAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "WorkOrder";
}
}
public …Run Code Online (Sandbox Code Playgroud) asp.net-mvc-routing asp.net-mvc-areas asp.net-mvc-5 asp.net-web-api2
我最近在工作中更新了我的MVC 2项目以使用区域,但是我对该RedirectToAction方法有一点问题.
我们的区域之外还有一些控制器等.这些控制器包括Home控制器等.
如何RedirectToAction从区域内部到区域外的控制器执行操作.
我认为以下内容可能会起作用但不会:
return RedirectToAction("Index", "Home", new { area = "" });
Run Code Online (Sandbox Code Playgroud)
要么
return RedirectToAction("Index", "Home", new { area = null });
Run Code Online (Sandbox Code Playgroud) 我目前正在研究如何重构现有的非模块化ASP.NET MVC 3.0应用程序的体系结构.我有一个类似于插件的插件,以使现有项目可扩展.
我已经搜索了制作模块化Web应用程序的不同策略,并发现了以下内容.我希望你对这些想法发表评论.
对于每个插件,我想创建一个单独的ASP.NET MVC项目,其中包含插件的控制器,视图和视图模型."员工"模块将包含用于列出,创建,更新和删除员工的区域.但是听起来不错,AreaRegistration需要将所有区域放在"bin"目录中.我找到了一种方法将Area项目直接放在Areas文件夹中,并从"/ Areas/[AreaName]/bin"文件夹中解析Area程序集:
BuildManager.AddReferencedAssembly.Add(Assembly.LoadFrom(…));
AppDomain.CurrentDomain.AssemblyResolve += ResolveAssemblies;
Run Code Online (Sandbox Code Playgroud)
这工作得很好,允许我在主项目的Areas文件夹中部署插件.我喜欢我使用ASP.NET MVC开箱即用的区域功能.
http://elegantcode.com/2012/04/06/mvc-portable-areas/
便携式区域似乎不是一种好方法,因为它们要求将视图编译为Area项目文件中的嵌入资源.这将阻止IIS缓存.另一方面,我真的无法想象性能缺点究竟有多大.
http://www.fidelitydesign.net/?p=104
为了在其他项目中创建松散耦合的服务,我非常依赖MEF.因此我认为使用它来发现ASP.NET MVC模块/插件是个好主意.我最终会使用一个ControllerFactory来实例化使用'Export'属性导出的控制器.这样我就可以完全控制插件实例化,并可以使用MEF来获取服务.然而,使用MEF确实需要比使用MVC区域更多的工作,MVC区域解决了开箱即用的控制器.
到目前为止,我无法解决的一个问题是如何在各个插件项目中分发实体.目前,我们使用Database First方法,该方法由一个包含所有实体的*.edmx模型文件组成.即使使用DbContext或Code First,也不可能为一个数据库使用多个DbContext类.一种想法是使用MEF将来自不同插件的实体加载到中央DbContext类中.但是我不知道这是否是支持和/或推荐的设置.
asp.net-mvc dependencies dependency-injection mef asp.net-mvc-areas
我有一个带有区域的MVC 2站点,假设区域名称为{Admin}
区域和网站工作正常.
我想要做的是为该区域设置不同的默认页面.
当我调用http:// webSiteName工作没有问题
但对于http:// webSiteName/Admin我收到错误
没有找到您要查的资源
我试了一下ASP.NET MVC 2 RC 2的解决方案,当没有指定区域 但没有运气时返回特定于区域的控制器.
我也试过了
routes.MapRoute(
"Admin",
"{controller}/{action}/{id}",
new { controller = "AdminHome", action = "index" },
new[] { "Web.Areas.Admin.Controllers" }
);
Run Code Online (Sandbox Code Playgroud)
和
routes.MapRoute(
"Admin",
"Admin",
new { controller = "AdminHome", action = "index" },
new string[] { "Web.Areas.Admin.Controllers" }
);
Run Code Online (Sandbox Code Playgroud)
但我仍然得到资源无法找到.
我究竟做错了什么?
我在MVC 3应用程序中设置了一个Admin区域,当我从根Scripts,Styles和Images文件夹中引用文件时,一切都正常工作,当我在这些文件夹下创建/Areas/admin/并引用它们时,它不起作用:
@Script.Include("~/admin/Scripts/superfish-1.4.8/js/superfish.js")
Run Code Online (Sandbox Code Playgroud)
请注意,这个Script.Include助手是我所拥有的,基本上吐出这个:
<script type="text/javascript" src="/admin/Scripts/superfish-1.4.8/js/superfish.js"></script>
Run Code Online (Sandbox Code Playgroud)
所以当我像这样引用时,助手正在工作,一切都很好
@Script.Include("~/Scripts/superfish-1.4.8/js/superfish.js")
Run Code Online (Sandbox Code Playgroud)
但是当我在那里介绍区域名称时.它会导致404错误.
我需要能够动态检索您所在页面的当前操作和控制器名称,并实际使用它们来创建一个新的HTML.ActionLink,它链接到相同的操作和控制器名称,但在不同的区域.所以我想我需要将当前操作和控制器名称检索为变量,以用于构建新的HTML.ActionLink.
因此,如果我在www.site.com/about页面上,我需要动态生成链接到www.site.com/es/about页面.
我基本上在一个单独的区域文件夹中构建了我的网站的西班牙语翻译版本(具有相同的命名控制器和操作和视图,只是内容全部是西班牙语).我需要用户能够在页面的英文版本(这是默认版本,并且位于根网站视图中)和西班牙语版本(其视图位于区域文件夹"es")之间来回切换.他们目前所在的页面.我不能"硬编码"这些链接,因为我需要在共享的局部视图中使用它,这是我在每个页面上使用的_Layout中的_topNavigation.
如果我需要澄清,请告诉我.我确信在本地化应用程序时使用"区域"并不是真正的方法,但我仍然在努力教自己asp.net MVC.我阅读了许多有关本地化的教程和示例,我可能无法让它们工作或有意义.
我还应该补充一点,我已经知道如何使用HTML.ActionLink在这些区域之间来回切换.我已经设法为西班牙语区域中的任何视图以及默认站点中的任何视图创建正确的HTML.ActionLinks.所以这不是我的问题.
任何帮助是极大的赞赏!谢谢!
asp.net-mvc controller toggle asp.net-mvc-areas html.actionlink
此代码位于母版页内:
Run Code Online (Sandbox Code Playgroud)<li><a href="<%=Url.Action("Action", "Controller") %>">Main site link</a></li> <li><a href="<%=Url.Action("AreaAction", "AreaController", new {area = "Area"}) %>">Area link</a></li>
所有的链接都很好,直到我去区域链接.当我去那里时,主要区域的所有路线都不起作用.
为了解决这个问题,我可以使用它:
Run Code Online (Sandbox Code Playgroud)<li><a href="<%=Url.Action("Action", "Controller", new {area = ""}) %>">Main site link</a></li>
我的问题是,有没有办法避免, new {area = ""}在主站点的每个链接?
在网站的每个链接上都有这个非常烦人.