Programing

asp.net MVC3 razor : 사용자 역할에 따라 액션 링크 표시

crosscheck 2020. 11. 26. 07:54
반응형

asp.net MVC3 razor : 사용자 역할에 따라 액션 링크 표시


저는 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>
}

평가가 거짓 인 경우 반환 할 선택적 MvcHtmlString 매개 변수를 제공하도록 Richard의 코드를 수정했습니다.

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")
 }

여기서 우리가하는 것은 사용자의 속성에 액세스하는 것입니다. 역할을 직접 관리하는 경우 유용 할 수 있습니다.


Richard가 제안한 솔루션은 정말 아름답습니다. Matthieu가 누군가가 렌더링 (또는 렌더링되지 않음)을 위해 추가 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>
}

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" })

참고 URL : https://stackoverflow.com/questions/6981853/asp-net-mvc3-razor-display-actionlink-based-on-user-role

반응형