我正在构建ASP MVC 4 Web应用程序,我需要为我的视图创建细粒度的权限。 这意味着我需要向某些用户显示一些操作,具体取决于他们的角色,数据类型请求和其他授权规则。
在控制器端,我在适当的位置放置了Authorize属性,并创建了细粒度的代码,如下所示:
public ActionResult Index() {
List<Survey> surveys;
if (MyUser.IsSuperUser) {
surveys = surveyRep.AllSurveys.ToList();
}
else {
surveys = surveyRep.VisibleSurveys.ToList();
}
return View(surveys);
}
因为我正在构建多租户应用程序,所以非超级用户的用户只能看到“可见”调查。超级用户总能看到一切。
现在的问题是如何在视图方面创建相同的东西,而不重复逻辑(DRY)。
目前,当用户不是超级用户并且只有一个租户链接时,我使用这个剃刀视图逻辑:
<h2>Create</h2>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Survey</legend>
@if (!MyUser.IsSingleTenant) {
<div class="editor-label">
Tenant
</div>
<div class="editor-field">
@Html.DropDownListFor(model => model.TenantID, ...
@Html.ValidationMessageFor(model => model.TenantID)
</div>
}
MyUser返回当前登录的使用情况,IsSingleTenant表示她是否只链接到单个租户。
我担心这会让我的观点变得混乱,因为很多“if-then”逻辑。
其他人如何解决这个问题?
谢谢你, IDO。
答案 0 :(得分:1)
这种方法没有错。您可以将这些部分放在部分视图中以使其更具可读性:
<h2>Create</h2>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Survey</legend>
@if (!MyUser.IsSingleTenant) {
@Html.Partial("Tenant")
}
...
</fieldset>
}