我过去使用局部视图来拆分大视图。但是,它们是限制用户访问的好方法吗?在我当前的设置中,未经授权的用户可以完全访问部分视图吗?
View:
@if (ViewBag.UserType == 1)
{
@Html.Partial("PartialView/_StandardUser");
}
else if (ViewBag.UserType == 2)
{
@Html.Partial("PartialView/_AdminUser");
}
Controller:
public ActionResult Index()
{
ViewBag.UserType = 2;
return View();
}
答案 0 :(得分:1)
剃刀视图在服务器上呈现。因此,最终用户只能看到逻辑结果。如果您不依赖某些外部参数(由客户端/用户发送),例如。查询/路由/其他指示特权的参数是可以的(如果您正在像应该对用户进行授权/身份验证那样,这是当然的-使用授权授权,然后考虑对特权进行一些逻辑处理)。但是,如果这2个是完全分开的(不使用html的同一部分,而这不是布局的一部分),我宁愿将它们分开,因为在这里看不到在视图中进行逻辑处理的任何好处。
答案 1 :(得分:0)
通过这种方式,您可以限制用户访问权限,并且未经授权的用户无法访问部分视图。
另一方面,更好的方法是使用用户角色来限制访问。例如:
View:
@if (Request.IsAuthenticated && User.IsInRole("Administrators"))
{
@Html.Partial("PartialView/_AdminUser");
}
else if (Request.IsAuthenticated && User.IsInRole("StandardUses"))
{
@Html.Partial("PartialView/_StandardUser");
}
Controller:
[Authorize(Users = "Administrators,StandardUses")]
public ActionResult Index()
{
return View();
}
答案 2 :(得分:0)
但是,它们是限制用户访问的好方法吗?
我要说的不是,不是从安全角度出发,而是从可维护性角度出发。视图应该是数据的HTML表示形式。直接出于可维护性的考虑,应尽可能限制直接在视图中混合逻辑。
因此,以下逻辑
@if (ViewBag.UserType == 1)
{
Html.RenderPartial("PartialView/_StandardUser");
}
else if (ViewBag.UserType == 2)
{
Html.RenderPartial("PartialView/_AdminUser");
}
可以简单地替换为:
视图:
@{Html.RenderAction("UserView");
控制器方法:
public class SomeController
{
public ActionResult UserView()
{
if (ViewBag.UserType == 1)
{
return Partial("PartialView/_StandardUser");
}
else if (ViewBag.UserType == 2)
{
return Partial("PartialView/_AdminUser");
}
return new EmptyResult();
}
}
在我当前的设置中,未经授权的用户可以完全访问部分视图。
如果您提供的代码是唯一返回那些Partials的代码,那么答案是是。但是,它的逻辑隐藏在视图中,我从不推荐。