0

我正在构建 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 指示她是否仅链接到单个租户。

恐怕这会使我的观点因大量“如果-那么”逻辑而变得混乱。

其他人如何解决这个问题?

谢谢你,伊多。

4

1 回答 1

1

这种方法没有任何问题。您可以将这些部分放在部分视图中以使其更具可读性:

<h2>Create</h2>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Survey</legend>

        @if (!MyUser.IsSingleTenant) {
            @Html.Partial("Tenant")
        }

        ...
    </fieldset>
}
于 2012-09-11T14:53:52.720 回答