我在网上部署了一个mvc3应用程序.如何在Url.Action()方法中添加虚拟目录名称?
例如:我的应用程序在mydomain.com\app中
现在当我这样做
Url.Action返回action ="/ Home/Create",但我想要的是action ="/ app/Home/Create".
应该做什么 ?
我有一些常见的网页将在多个MVC应用程序中.对于那些页面,我想在不同的MVC网站之间重用相同的源代码(控制器+视图).这样做的最佳方法是什么?
ASP.NET MVC区域似乎是一种可能性,但它们只是网站项目的子目录.是否可以在多个MVC应用程序中重用MVC区域?
我有一个有3个区域的MVC项目.在主项目中,我使用web.config中的自定义错误设置了错误处理.
<customErrors mode="On" defaultRedirect="~/Error/HttpError">
<error statusCode="404" redirect="~/Error/Http404" /> </customErrors>
Run Code Online (Sandbox Code Playgroud)
这会导致站点重定向到根目录中的错误控制器,然后显示错误视图.
这在根站点中正常工作,但是当我在其中一个区域站点的主控制器中抛出异常时,它会显示在下面的消息中.
运行时错误说明:服务器上发生应用程序错误.此应用程序的当前自定义错误设置可防止查看应用程序错误的详细信息.
详细信息:要在本地服务器计算机上查看此特定错误消息的详细信息,请在位于当前Web应用程序根目录中的"web.config"配置文件中创建标记.然后,此标记应将其"mode"属性设置为"RemoteOnly".要使详细信息可在远程计算机上查看,请将"mode"设置为"Off".
是否会出现根网站中的错误处理无法在区域网站中使用的情况?
谢谢
约翰.
有没有办法可以获得MVC项目中的区域名称?
以下是我能想到的几种方法:
a)如果我有源,我可以浏览项目文件夹结构并枚举Areas文件夹下的文件夹.但这并不能保证所有文件夹都代表区域,除非我还枚举了每个子文件夹下的Controllers and Views文件夹.你可以说,这种方法很糟糕.
b)从二进制文件中,我可以枚举符合条件的所有名称空间RootNamespaceOfProject.Areas.*.
或者,我确信这是一种更优雅的方式.ASP.NET MVC框架中必须有一些字典可以记录所有区域.
其次,MVC框架中是否还有一个代表一个区域的程序化构造?我好像找不到一个.只有四个与区域相关的结构:
1. AreaRegistration
2. AreaRegistrationContext
3. IRouteWithArea
4. AreaHelpers (an internal class)
Run Code Online (Sandbox Code Playgroud)
如果有的话,那么是否有可能枚举该区域内的所有控制器?
编辑
我只是注意到MVC-AreaRegistrationTypeCache.xml在文件夹\ Windows\Microsoft.NET\Framework\v4.xx\Temporary ASP.NET Files\root\RandomlyGeneratedHash1\RandomlyGeneratedHash2\UserCache中调用了此文件.
该文件夹有两个文件:
a)MVC-AreaRegistrationTypeCache.xml:此文件包含计算机上具有区域的所有程序集中的所有区域的列表.
b)MVC-ControllerTypeCache.xml:该文件列出了程序集区域内的控制器.
现在,唯一要弄清楚的是,是否有一些编程方式让MVC框架读取这些文件并告诉我二进制文件中是否存在某个区域.
我在想这个AreaRegistration班可能就是那个.进一步探索......
由于它本身似乎不受支持,因此建议的每个区域实现全局过滤器的方法是什么?
我目前正在编写一个Admin MVC 3站点,每个用户只能访问该站点的某些部分.
我的站点区域与用户角色相同,所以我想要做的是在每个区域放置AuthorizeAttribute,使用区域名称作为角色中的参数.
到目前为止,当我对每个区域的检查进行硬编码时,我已经开始工作了,但是我想循环遍历所有区域并应用授权过滤器.(我使用它作为我的自定义FilterProvider - http://www.dotnetcurry.com/ShowArticle.aspx?ID=578)
到目前为止我的代码("Gcm"是我的一个领域,也是一个角色):
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
// for all controllers, run AdminAuthorizeAttribute to make sure they're at least logged in
filters.Add(ObjectFactory.GetInstance<AdminAuthorizeAttribute>());
AdminAuthorizeAttribute gcmAuthroizeAttribute = ObjectFactory.GetInstance<AdminAuthorizeAttribute>();
gcmAuthroizeAttribute.Roles = "Gcm";
var provider = new FilterProvider();
provider.Add(
x =>
x.RouteData.DataTokens["area"] != null && x.RouteData.DataTokens["area"].ToString() == "Gcm"
? gcmAuthroizeAttribute
: null);
FilterProviders.Providers.Add(provider);
}
Run Code Online (Sandbox Code Playgroud)
有谁知道如何获得我的应用程序的所有区域,所以我可以循环它们,而不是硬编码每个区域?
或者,如果有人对如何授权每个区域有更好的了解,那将是值得赞赏的.
谢谢你的帮助Saan
asp.net-mvc filter asp.net-mvc-areas authorize-attribute asp.net-mvc-3
我有简单的HttpApplication类:
public class MvcApplication : HttpApplication
{
public void Application_Start()
{
// register areas
AreaRegistration.RegisterAllAreas();
// register other stuff...
}
}
Run Code Online (Sandbox Code Playgroud)
我的单元测试初始化HttpApplication,调用ApplicationStart和验证应用程序启动行为.
这种方法很有效,直到我必须整合MVC领域.当AreaRegistration.RegisterAllAreas()单元测试调用时,会抛出以下异常:
System.InvalidOperationException: This method cannot be called during the application's pre-start initialization stage.
是否有一种测试区域初始化逻辑的好方法?
c# unit-testing initialization asp.net-mvc-areas asp.net-mvc-3
我有一个单独的部分(路线)我的网站,我想使用不同的布局/ CSS等.
因此,当我的网站主要部分的用户获得默认布局时.但是当他们登录并进入商店时,商店部分(路线)使用不同的布局/ css.
所以...
...都使用默认的_Layout
但...
...使用_LayoutStore
我已经看到这完成基于这里的角色(http://forums.asp.net/t/1653362.aspx/1)和这里(如何在MVC 3中使用多个布局?)但我不想去做.我需要根据客户的路线选择我的布局(也就是看他们在里面).
提前感谢您提供任何帮助.
asp.net-mvc asp.net-mvc-routing asp.net-mvc-areas asp.net-mvc-4
我有一个带有区域的互联网应用程序mvc4,对于我的组织,每个区域代表一个SPA,通过"管理NuGet包",我安装了"Durandal 1.2.0","Durandal Transitions 1.2.0"和"Durandal Router 1.2.0".我组织了文件夹并退出Durandal文件夹"App"中的"views"和"viewmodels",并将新视图放在mvc4区域的文件夹"VIews"中,例如:
领域 - > NewArea - >查看 - > ControllerFolder - >视图 - > shell.html
然后我将'"viewmodels"放在"Script"文件夹中,例如:
脚本 - > NewArea - > ControllerFolder - >的ViewModels - > shell.js
脚本 - > NewArea - > ControllerFolder - > main.js
然后我改变了durandal JS的路径,例如在main.js中:
define(['../../../App/durandal/app',
'../../../App/durandal/viewLocator',
'../../../App/durandal/system',
'../../../App/durandal/plugins/router',
'../../../App/services/logger'],
Run Code Online (Sandbox Code Playgroud)
我在下一行改变了main.js:
viewLocator.useConvention('viewmodels', '../Areas/NewArea/Views/ControllerFolder/views');
Run Code Online (Sandbox Code Playgroud)
但是文件夹的配置失败,因为下一行在其定义中调用了模块"viewLocator"的不同时间,并使用默认值重写"useConvention"的配置:
app.setRoot('viewmodels/shell', 'entrance');
Run Code Online (Sandbox Code Playgroud)
仅当文件夹"views"和"viewmodels"不在"Durandal"的"App"文件夹下时才会发生这种情况.
请帮助我,如何在同一个项目中拥有各种SPA?
如果我右键单击MVC网站项目并选择Add-> Area ...然后输入区域名称并点击"添加".我明白了:
"运行所选代码生成器时出错:'值不在预期范围内'"
我的所有同事也有同样的问题.
任何人都可以阐明这一点吗?
asp.net-mvc-areas asp.net-mvc-scaffolding visual-studio-2013 asp.net-mvc-5.1