2010-04-27 5 views
5

항목 목록을 표시하는보기가 있습니다. 사용자는 새 항목을 편집, 삭제 또는 생성 할 수 있지만 권한에 따라 일부 작업을 수행 할 수도 있고하지 않을 수도 있습니다.mvc에서 뷰의 권한 부여 논리를 해제하는 방법은 무엇입니까?

나는 현재 사용자가 할 수 경우에만 작업을 표시하기위한 요구 사항을 가지고,하지만 난 인증으로 의견을 혼란하고 싶지 않은 경우 - 다른 매우 일반적인 요구되는의

경멸, I 그것을 수행하는 실제 만족스러운 방법을 찾을 수 없습니다.

가장 좋은 방법은 요청에 대한 승인이 필요한 Html.ActionLink 확장 메소드에 과부하를 제공하는 것입니다. 그러나 HTML의 전체 블록을 숨기거나 레이블을위한 텍스트 상자를 전환하는 것과 같은 더 복잡한 시나리오가있을 것입니다 + 숨김.

더 좋은 방법이 있나요?

답변

2

예를 들어, Html.RenderAction (link : http://msdn.microsoft.com/en-us/library/ee703490.aspx)을 호출 한 다음 경로 값으로 사용할 링크를 액션 메소드에 전달할 수 있습니다 (액션에 대한 매개 변수로 나타남)). RenderAction이기 때문에 컨트롤러 프로세스로 돌아가서 사용자 상태에 따라 원하는보기 또는 데이터를 렌더링 할 수 있습니다.

예 :

<% Html.RenderAction("Permissions" /* Controller */, "PermissionLink", new { Url = "Admin.aspx" }); %> 

그리고 컨트롤러는 식으로 뭔가를 할 것이다 :

public ActionResult PermissionsLink (string url) 
{ 
    // Do Whatever kind of Authentication you want here, Session is available, etc 

    if(authenticated) 
     return View("Link"); 
    else 
     return View("Blank"); 
} 
+0

이것은 krisg이 그의 답변에 제안한 것을 수행하는 더 좋은 방법이지만, 여전히 구성 요소 수준 (krisg은보기 수준에 있음)에 있습니다. 어쩌면 나는 "RowAction"구성 요소를 수행하고 사용자가 할 수있는 액션을 렌더링하기 위해 모든 행을 호출 할만큼 미친 것은 아니지만 마침내 하나의 툴바만으로 항목에 대해 작동하는 체크 박스 접근 방식을 구현할 수 있습니다 . 그것은 나에게 어느 정도 걸렸다. 그러나 나는 그것을 얻었다. Tnks. –

0

같은 문제가있었습니다. 우리는 많은 도우미 메서드를 작성하고 많은 html 출력이 필요한 경우 부분 뷰에 넣었습니다.

0

그렇지 다음, 사용자가 변경할 수 있습니다 값 내용에 따라 다양한 컨트롤 여러 뷰를 생성하는 것이 더 간단 할 것인가 사용자의 액세스 권한을 기반으로 올바른보기를 반환 하시겠습니까?

조회수는 정보를 제공하기위한 것이어야하며, 조건부 논리가 포함되어서는 안되며 적어도 최소값 이상이어야합니다.

나는 항상 내가 당신과 같은 상황을 괴롭히는 것이 어렵다고 생각할 때 찾아 냈습니다. 가장 좋은 해결책은 항상 컨트롤러로 돌아가서 제가 전달하는 것을 평가하는 것입니다. 처음에는보기.

중요한 일을하기 위해보기가 호출 될 때까지 모든 중요한 '결정'이 이미 이루어져야합니다. 나는이 그런 식으로하고있어 많은 조건과 규칙입니다 복잡한 상황에서

+2

나는 당신이 말하는 것을 이해하지만 모든 결정을 내릴 수있는 견해를 갖는 것은 실용적이지 않습니다. 위의 예에서 7 가지 견해가 있습니다 (각 조합마다 하나씩). 이제 액세스가 제한된 기능이 많은 비즈니스 앱을 높은 수준으로 생각해보십시오. 때로는 구성이 가장 좋은 방법이지만 구성 요소 수준에서 결정해야 할 사항이 있습니다. –

+0

그래서 나는 processshippment 작업을 위해 34 회의 조회수를 계산했다. 이것은 좋은 접근 방법이 아닙니다. :/ – dariol

0

:

뷰 모델을

public class ModelView 
{ 
    private IAuthorisationService { get; set; } 

    public bool CanShow 
    { 
     ... 
    } 
} 

보기 : 저는 개인적으로 아무 잘못 표시되지 않습니다

<% if(Model.CanShow) { %> 
    <html> 
<% } %> 
+0

이것은 내가하고 싶지 않은 것입니다 : if 문을 권한 부여를 위해 뷰에 놓습니다. 이 방법은 ViewMessage 또는 다른 것에 대한 사용 권한을로드 한 다음 쿼리하는 것보다 여전히 좋습니다. –

0

이 종류의 조건부 논리가보기 내에 있습니다. 논리는 여전히 모든 발표에 관한 것입니다. 표시 또는 숨기기, 활성화 또는 비활성화, 강조 표시 등을 결정합니다. 이것은 컨트롤러의 작업이 아닌보기의 작업입니다. 보기가 실제로 결정을 내리는 데 필요한 것을 계산할 필요가없는 한.컨트롤러는 뷰의 구현에 대해 다른 방식으로 불가지론해야합니다.

내 방식이 될 것이다 :

  • 컨트롤러는 사용자가 가지고있는 액세스 수준을 결정하는 실제 로직을 확인
  • (뷰 모델을 통해 예)를 사용하여보기에이 정보를 전달하지만, 구현 세부 사항에 중립적 인 방식으로 (예 : "사용자가 관리자", "사용자가 저자"등)
  • 컨트롤러가 제공 한 미리 컴파일 된 데이터 만 사용하여 뷰를 적절하게 그려 보도록하십시오.

또한 컨트롤러 자체에 영향을주지 않고도 뷰 자체를 제거하고 바꿀 수있는 이점이 있습니다.

관련 문제