MSDN说:
要限制对ASP.NET MVC视图的访问,请限制对呈现视图的操作方法的访问。 为此,MVC框架提供了AuthorizeAttribute类。
我正在使用正在加载嵌套部分视图的应用程序(缺少更好的术语)
public ActionResult Index(int id)
{
....stuff.....
return PartialView("PartialViewName", model);
}
在上面加载的部分视图中,嵌套就像:
PartialView.cshtml
@Html.Partial("AnotherPartial", Model)
-@Html.Partial("AnotherPartial_Partial", Model)
-@Html.Partial("AnotherPartial_Partial_Partial", Model)
@Html.Partial("YetAnotherPartial", Model)
@Html.Partial("StillAnotherPartial", Model)
当我想允许访问一个局部视图但不允许访问另一个局部视图时,我该怎么办?这些部分中的具体元素怎么样?像按钮,面板,div,文本框等......
我在我的数据库中定义了用户和角色,因此我知道谁可以访问哪个元素/部分视图。
目前我正在使用自己的Html Helper来显示或隐藏部分视图:
public static MvcHtmlString ShowHidePartial(this HtmlHelper helper, string partialName, TheUser user)
{
bool? isVisible = false;
//If I don't know who you are or what you are trying to view
if (user == null || string.IsNullOrEmpty(partialName))
{
return MvcHtmlString.Empty;
}
if (IsAdmin(user))
{
return MvcHtmlString.Create(helper.Partial(partialName).ToString());
}
else
{
isVisible = IsVisible(partialName, user);
}
if (isVisible == true)
{
return MvcHtmlString.Create(helper.Partial(partialName).ToString());
}
return MvcHtmlString.Empty;
}
我可能会坚持使用这种方法来渲染部分内容,但我仍然不确定如何继续限制对这些部分中元素的访问/可见性。
例如,如果用户有权访问AnotherPartial.cshtml,并且该部分有4个部分允许用户查看/编辑信息(如成员地址,成员状态,成员电话和成员出生日期)使用更新/保存按钮。这些部分是AnotherPartial.cshtml独有的。
假设我只想让用户查看(ReadOnly)2个部分,编辑(ReadWrite)1部分,并完全隐藏第4部分(隐藏?...无访问权限)。我将如何实现这一目标?
我正在使用Windows身份验证来访问该应用程序。
答案 0 :(得分:0)
我不确定你是否有与这些偏见相关的动作,但看起来你想要使用Html.Partial,这样你就不必一遍又一遍地重建你的模型。在你的情况下我会做的一件事就是传递你想要显示那些部分的角色。在这种情况下你必须要小心,因为这并不完全符合Separation of Concerns的概念,因为你在视图中提供了一些业务逻辑。但似乎你已经走了这条路。因此,为了扩展您的方法,您可以执行以下操作。 我假设你的TheUser类有一个Roles属性。
public static MvcHtmlString ShowHidePartial(this HtmlHelper helper, string partialName, TheUser user, string [] roles)
{
if(roles = null)
{
return MvcHtmlString.Empty;
}
//If I don't know who you are or what you are trying to view
if(user != null && !string.IsNullOrEmpty(partialName) && user.Roles.Any(r=> roles.Contains(r)) )
{
return MvcHtmlString.Create(helper.Partial(partialName).ToString());
}
return MvcHtmlString.Empty;
}
所以现在你的观点看起来像这样:
@Html.ShowHidePartial("AnotherPartial", Model, new string[] {"AuthorizedRole1", "AuthorizedRole2"})
-@Html.ShowHidePartial("AnotherPartial_Partial", Model, new string[] {"AuthorizedRole1"})
-@Html.ShowHidePartial("AnotherPartial_Partial_Partial", Model, new string[] {"AuthorizedRole1", "AuthorizedRole3"})
@Html.ShowHidePartial("YetAnotherPartial", Model, new string[] {})
@Html.ShowHidePartial("StillAnotherPartial", Model, new string[] {})
选项2 根据角色构建视图,例如包含管理视图所需部分的AdminView.cshtml。然后在您的业务逻辑代码中决定要执行的视图。这将完全发生在视图代码之外,并且符合分离关注的概念。