【问题标题】:Use custom attribute in a view在视图中使用自定义属性
【发布时间】:2014-05-27 15:24:52
【问题描述】:

我习惯于创建自定义属性以防止不同的访问级别访问控制器中的某些方法:

[AuthorizeUser(AccessLevel = "Administrator")]
public ActionResult Index()
{
    return View("Index");
}

但现在我想在视图中使用相同的自定义属性。例如,当您是管理员时,目标是显示一些 HTML。

这听起来很奇怪,但我对此一无所知。任何帮助将不胜感激。

【问题讨论】:

  • 访问级别本质上是成员资格吗?如果是这样,请使用 Role 而不是 AccessLevel。我们不应该重新发明轮子。如果你使用角色,你可以使用 User.IsInRole()
  • 谢谢它现在有效。我使用了角色,它完美地工作! :)

标签: asp.net-mvc custom-attributes asp.net-mvc-views


【解决方案1】:

我不确定这是否是正确的方法,但这可以工作。

解决方案1

您可以在模型中使用boolean 来检查用户是否具有特定角色,然后基于该模型创建视图 例如。

public class MyViewWithCustomAuthentication
{
  ....
  public bool IsAdmin{get;set;}
  ...
}

在您的控制器中,您可以检查用户是否处于特定角色

public ActionResult Index()
{
    var myView = new MyViewWithCustomAuthentication();
    myview.IsAdmin = false;
    if(User.IsInRole("Admin"))
    {
       myView.IsAdmin = true;
    }

    return View(myView);
}

然后在视图中

@model MyViewWithCustomAuthentication
....
@if(Model.IsAdmin == true)
{
  //show HTML
}
else
{
  //hide HTML
}
....

在这里您将拥有一个视图,但您可能需要对视图模型进行一些小的更改,正如我所提到的。

解决方案 2

另一种方法是检查用户是否处于某个角色并根据要求为不同角色创建不同的视图。这样,您可以显示所需的 HTML,但最终会看到不同的视图。

public ActionResult Index()
{       
    if(User.IsInRole("Admin"))
    {
       return View("ViewForAdmin")
    }

    return View("ViewForNonAdmin");
}

如果有人有任何建议,请随时编辑或评论。

【讨论】:

    【解决方案2】:

    您应该能够使用部分视图和RenderAction

    [ChildActionOnly]
    [AuthorizeUser(AccessLevel = "Administrator")]
    public ActionResult AdminPartial() {
      return PartialView();
    }
    

    在视图内部,您需要管理 HTML sn-p。

    @{Html.RenderAction("AdminPartial");}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 2015-01-27
      • 2013-09-01
      • 1970-01-01
      • 2017-07-28
      • 2021-07-21
      相关资源
      最近更新 更多