[Authorize]利用控制器和动作上的属性来限制访问是非常棒的.
是否可以在MVC 2中为整个区域执行等效操作?我可以限制区域范围内的访问权限取决于角色/用户/中心位置的任何内容,而不是在所有控制器中乱丢它们?
我为我的Asp.net MVC 3应用程序提供了一些自定义的Html助手.在主应用程序中,它们正常工作,因为我已将以下内容放入我的Web.Config:
<pages clientIDMode="AutoID">
<namespaces>
<add namespace="System.Web.Helpers" />
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="System.Web.WebPages"/>
<add namespace="WebDibaelsaMVC.Utils.HtmlHelpers" />
<add namespace="WebDibaelsaMVC.Utils.HtmlHelpers.DTOs" />
</namespaces>
</pages>
Run Code Online (Sandbox Code Playgroud)
但我现在已经创建了一个区域并使我的自定义助手工作,我必须在我使用它们的每个页面中添加一个使用.有没有办法为该区域添加默认名称空间?
我的ASP.NET MVC3应用程序中有一些区域:
namespace MyProject.Areas.myarea
{
public class myareaAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "myarea";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"myarea_default",
"myarea/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这个区域包含"Hello"控制器,带有"Smile"动作.
在整个项目的global.asax文件中,我有:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
Run Code Online (Sandbox Code Playgroud)
所以,当我请求"localhost/myarea/hello/smile"时,它按预期调用适当的控制器.
但!当我请求"localhost/hello/smile"时,它会调用hello控制器STILL!有了它,它会查找不在myarea/Views文件夹中的Views,而是在〜/ …
我想在现有的MVC项目中构建一个版本化的WebApi,以便我的URL可以
/api/v1/account
/api/v2/account
Run Code Online (Sandbox Code Playgroud)
我目前不使用区域,但经过一些研究后,我认为这对我Areas有用,但显然你无法嵌套(我目前正在使用MVC4,但可以升级到5).
我怎样才能做到最好?
更新
我最终使用了这个
c# asp.net-mvc asp.net-mvc-areas asp.net-mvc-4 asp.net-web-api
我正在使用自定义过滤器检查特定Action的用户访问权限,我有一个名为Admin的区域.当过滤器重定向未授权用户时,其重定向内部区域但不重定向到路径目录中的视图.
例如,当我访问http:// localhost/admin/roles时,我希望未经授权的用户将被重新安装到http:// localhost/authorized但不会被重新安装到http:// localhost/admin/authorized.
这是我如何使用过滤器:
public override void OnAuthorization(AuthorizationContext filterContext)
{
DigitalHubOnlineStoreEntities db = new DigitalHubOnlineStoreEntities();
RbacUser requestingUser = new RbacUser();
var controllerid = RbacUser.GetControllerId(filterContext.ActionDescriptor.ControllerDescriptor.ControllerName);
var actionid = RbacUser.GetActionId(filterContext.ActionDescriptor.ActionName, controllerid);
if (!requestingUser.GetUserPermission(HttpContext.Current.User.Identity.Name, actionid, controllerid))
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "action", "Index" }, { "controller", "Unauthorized" } });
}
}
Run Code Online (Sandbox Code Playgroud) "publishOptions": {
"include": [
"wwwroot",
"Views",
"Areas/**/Views",
"appsettings.json",
"web.config"
]
},
Run Code Online (Sandbox Code Playgroud)
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<WebPublishMethod>MSDeploy</WebPublishMethod>
<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
<LastUsedPlatform>Any CPU</LastUsedPlatform>
<SiteUrlToLaunchAfterPublish>http://somedomain/</SiteUrlToLaunchAfterPublish>
<LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
<ExcludeApp_Data>False</ExcludeApp_Data>
<PublishFramework>netcoreapp1.0</PublishFramework>
<UsePowerShell>True</UsePowerShell>
<EnableMSDeployAppOffline>True</EnableMSDeployAppOffline>
<MSDeployServiceURL>http://someip</MSDeployServiceURL>
<DeployIisAppPath>sitename</DeployIisAppPath>
<RemoteSitePhysicalPath />
<SkipExtraFilesOnServer>True</SkipExtraFilesOnServer>
<MSDeployPublishMethod>RemoteAgent</MSDeployPublishMethod>
<EnableMSDeployBackup>False</EnableMSDeployBackup>
<UserName>username</UserName>
<_SavePWD>True</_SavePWD>
<PublishDatabaseSettings>
<Objects xmlns="" />
</PublishDatabaseSettings>
<ADUsesOwinOrOpenIdConnect>False</ADUsesOwinOrOpenIdConnect>
<AuthType>NTLM</AuthType>
</PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
成功部署后,服务器中缺少区域视图。没有Area文件夹,该区域的视图也不位于Views文件夹中。所有其他视图(区域外)均存在。
我做错了什么还是这个问题是已知的?有人遇到同样的问题吗?如果有,解决方案是什么?
asp.net-mvc-areas asp.net-mvc-views webdeploy visual-studio-2015 asp.net-core
下图显示了我正在处理的项目结构:
在区域 -> 计费 -> 视图 -> _viewstart.cshtml 内部,我已指定要应用于整个应用程序的布局的路径,但我不断收到以下错误:
InvalidOperationException:无法找到布局视图“~/Views/Shared/_Layout.cshtml”。搜索了以下位置:~/Views/Shared/_Layout.cshtml
布局路径
@{ 布局 = "~/Views/Shared/_Layout.cshtml"; }
我有一个MVC 3 Razor项目.它有一个叫Admin的区域.我在项目的Views/Shared文件夹中具有页面的基本布局(默认情况下).我在主项目中有一个名为Common的控制器.它将负责布局的某些部分,这些部分基于业务逻辑(基于角色的导航等).我有
@Html.Action("Navigation", "Common")
在_layout.cshtml文件中调用.这被设置为渲染导航栏.当我转到管理区域中的路由("admin/somedomainobject/add")时,运行时错误指出以下内容:
"路径控制器"/ admin/somedomainobject/add"未找到或未实现IController."
当我从布局中删除线条时,它存在很好.如果我使用上述语法或以下语法,则会发生错误:
@{Html.RenderAction("Naviation", "Common");}
Run Code Online (Sandbox Code Playgroud)
是因为我在使用区域吗?我是否以错误的方式使用主项目文件夹?
任何想法将不胜感激!
我似乎遇到了命名空间或注册问题.在这一点上,我更倾向于使用MVC 3.0的区域和注册问题,但我对这里的任何想法持开放态度.
我的CAPAreaRegistration.cs文件看起来像这样:
namespace CISE.CINet.UserInterface.Areas.CAP
{
public class CAPAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "CAP";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"CAP_default",
"CAP/{controller}/{action}/{id}",
new { action = "NewNomination", id = UrlParameter.Optional }
);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我也尝试添加命名空间我改变了一切:
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"CAP_default",
"CAP/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }, new string[] { "CISE.CINet.UserInterface.Areas.CAP.Controllers" } // specify the new namespace
);
}
Run Code Online (Sandbox Code Playgroud)
Global.asax看起来像这样:
namespace CISE.CINet.UserInterface
{ …Run Code Online (Sandbox Code Playgroud) 我写了一个自定义路由处理程序.因为我的网站中的区域中存在冲突的控制器名称,所以我收到错误:找到了多个匹配控制器命名的类型...
我想我需要在我的处理程序中指定一个命名空间,对吧?
我尝试了以下,没有一个工作:
public class MyRouteHandler : MvcRouteHandler
{
protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
{
(... complicated DB lookups and "re-writing" of requestContext.RouteData.Values["controller"] ...)
// doesn't work
requestContext.RouteData.Values["namespaces"] = new[] { "Site.Contollers" };
// doesn't work
requestContext.RouteData.DataTokens.Add("namespaces", new[] { "Site.Contollers" });
// doesn't work
requestContext.RouteData.Values["namespaces"] = "Site.Contollers";
// doesn't work
requestContext.RouteData.DataTokens.Add("namespaces", "Site.Contollers");
(... snip ...)
return base.GetHttpHandler(requestContext);
}
}
Run Code Online (Sandbox Code Playgroud)
什么是正确的方法?
注意:因为我的处理程序执行数据库查找并根据结果选择不同的控制器,所以我不能在我的Global.asax.cs文件中使用基本的MapRoute()方法(据我所知).
asp.net-mvc namespaces mvcroutehandler asp.net-mvc-routing asp.net-mvc-areas
c# ×4
asp.net-mvc ×3
razor ×2
asp.net-core ×1
controller ×1
namespaces ×1
registration ×1
webdeploy ×1