web-dev-qa-db-ja.com

asp.net MVC3カミソリ:ユーザーロールに基づいてアクションリンクを表示

私はMVCが初めてです。一部のユーザーに対してアクションリンクを非表示にできるようにしたい。 「作成」アクションリンクがあり、管理者にのみ表示してクリックさせたいとします。 asp.netで利用可能な「loggedintemplate」のようなものを使用したいのですが、かみそりでは動作しないようです。

現在のユーザーと彼女の役割をチェックするifステートメントで何らかのコードブロックを使用できますが、それはベストプラクティスではないかもしれません。

私のindex.cshtml ..

// want some adminauth attribute here...
@Html.ActionLink("Create New", "Create")

私のコントローラー。

// GET: /Speaker/Create
[Authorize(Roles = "Administrators")]
public ActionResult Create()
{
    return View();
}
62
Mathias Nohall

これまでに、次のような条件が満たされた場合にのみ出力を返すヘルパー関数を作成しました。

public static MvcHtmlString If(this MvcHtmlString value, bool evaluation)
{
     return evaluation ? value : MvcHtmlString.Empty;
}

これを使用できます:

@Html.ActionLink("Create New", "Create").If(User.IsInRole("Administrators"))

このように、それは読みやすく、短いです

136
Richard

コードブロックが必要な場合は、ビューで行います。

@if (Roles.IsUserInRole("Administrators"))
{
  <li>@Html.ActionLink("Create New", "Create")</li>
}
41
Matthieu

Richardのコードを変更して、評価がfalseの場合に返すオプションのMvcHtmlStringパラメーターを提供しました。

public static MvcHtmlString If(this MvcHtmlString value, bool evaluation, MvcHtmlString falseValue = default(MvcHtmlString))
        {
            return evaluation ? value : falseValue;
        }
7
Elan Hasson

roleManagerを有効にしていなくてもユーザーの役割を確認したい場合は、次のようにします。

 @if (@User.IsInRole("administrator"))
 {
   @Html.ActionLink("Create New Version", "Create")
 }

ここで行っているのは、ユーザーのプロパティにアクセスしているだけです。これは、ロールを自分で管理する場合に役立ちます。

2
Sudarshan_SMD

App_Code/ViewFunctions.cshtmlに関数を追加できます(見つからない場合は作成します)

@using System.Web.Mvc;
@functions{
public static object ConditionalActionLink(object actionLink, ICollection<string> arrAuthUsers)
{
    bool objIsVisible = arrAuthUsers
        .Select(s => User.IsInRole(s))
        .Where(s => s.Equals(true))
        .Any();

    return (objIsVisible)
        ? actionLink
        : MvcHtmlString.Empty;
}

この関数を使用するには、次のコードをビューに追加するだけです。

@ViewFunctions.ConditionalActionLink(
@Html.ActionLink("TextToDisplay", "SomeAction", new { Area = "SomeArea", Controller = "SomeController" }), 
new string[] { "administrator","jDoe", "someOtherUser" })

リチャードによって提案された解決策は本当に美しいですが、マシューは誰かが同様にレンダリングされる(またはレンダリングされない)ために余分なhtmlコードを必要とするかもしれないと指摘しました。したがって、Matthieuのソリューションはより広く適用できるようです。拡張メソッドで管理者と見なされるユーザーに関するロジックを一元化します。

拡張方法:

public static bool IsAdmin(this WebViewPage page)
{
    return page.User.IsInRole(@"Domain\ProjectAdmins");
}

使用法:

@if (this.IsAdmin())
{
    <p>
        @Html.ActionLink("Create New Version", "Create")
    </p>
}
0