私は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();
}
これまでに、次のような条件が満たされた場合にのみ出力を返すヘルパー関数を作成しました。
public static MvcHtmlString If(this MvcHtmlString value, bool evaluation)
{
return evaluation ? value : MvcHtmlString.Empty;
}
これを使用できます:
@Html.ActionLink("Create New", "Create").If(User.IsInRole("Administrators"))
このように、それは読みやすく、短いです
コードブロックが必要な場合は、ビューで行います。
@if (Roles.IsUserInRole("Administrators"))
{
<li>@Html.ActionLink("Create New", "Create")</li>
}
Richardのコードを変更して、評価がfalseの場合に返すオプションのMvcHtmlStringパラメーターを提供しました。
public static MvcHtmlString If(this MvcHtmlString value, bool evaluation, MvcHtmlString falseValue = default(MvcHtmlString))
{
return evaluation ? value : falseValue;
}
roleManager
を有効にしていなくてもユーザーの役割を確認したい場合は、次のようにします。
@if (@User.IsInRole("administrator"))
{
@Html.ActionLink("Create New Version", "Create")
}
ここで行っているのは、ユーザーのプロパティにアクセスしているだけです。これは、ロールを自分で管理する場合に役立ちます。
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>
}