2009-12-23 3 views

답변

4

을이 MVC의 왜곡 같은 소리하고 컨트롤러의 리디렉션을 할 수 있다면, 당신의 논리가 아니다 옳은. '당신 때문이다 귀하의 코멘트에

는, 당신이 언급 한

<meta http-equiv="refresh" content='0;url=<%=Html.Action("MyAction","MyController") %>'> 

업데이트 :

그러나, 여기에 내가 어떤 이유로 컨트롤러에 액세스하지 않은 경우 내가 사용하는 것 인 것이다 역할 검사를하고 모든 컨트롤러/작업에서이 작업을 수행하고 싶지는 않습니다. 그렇다면 여기에 고려해야 할 사항이 있습니다.

기본 컨트롤러 클래스를 만들고 모든 컨트롤러가이 클래스에서 확장되도록하십시오.

기본 컨트롤러에 OnActionExecuting 방법이 있습니다. 여기에 다음과 같은 내용이 있습니다.

public class MyBaseController : Controller 
{ 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
    base.OnActionExecuting(filterContext); 
    if (/*the user is not in the role desired*/) 
    { 
     RedirectToRoute(filterContext, new { controller = "MyController", action = "MyAction"}); 
    } 
    } 

    private void RedirectToRoute(ActionExecutingContext context, object routeValues) 
    { 
    var rc = new RequestContext(context.HttpContext, context.RouteData); 
    string url = RouteTable.Routes.GetVirtualPath(rc, new RouteValueDictionary(routeValues)).VirtualPath; 
    context.HttpContext.Response.Redirect(url, true); 
    } 
} 
+0

그것은 역할을 검사하는 것입니다. 나는 마스터 페이지에서 그것을 할 수있을 때 모든 단일 액션에 코드를 넣고 싶지 않습니다. – BigOmega

+0

좋습니다. 음, Html.Action을 표시하는 메타 태그를 업데이트했습니다. 이것은 필요한 모든 것을해야합니다. –

+0

아 ~ 그래서 이것을 추가해야 할 것입니다. 보기에서 어디서든 할 수는 없습니까? 방법이 없니? 나는 HTML이 무엇인지, 감사하다고 생각한다. – BigOmega

0

가장 좋은 옵션은 조건부를 컨트롤러로 옮기고 리다이렉션을 수행하는 것입니다 (리디렉션 로직을 테스트하기 쉽습니다). 다른 방법으로는 조건과 같이 당신의보기의 서버 측과 자바 스크립트 문을 래핑 수 :

<% if (viewShouldRedirect) { %> 
    <script type="text/javascript"> 
     window.location = "/Your/New/Url"; 
    </script> 
<% } %> 
+0

예. 사용자가 JS를 사용할 수 없도록 설정 한 경우 (NoScript 또는 wotnot), 작동하지 않습니다. –

+0

+1 논리를 컨트롤러로 이동합니다. 리디렉션하려는 경우 브라우저에보기를 렌더링 할 이유가 없습니다. – tvanfosson

+0

예 JS는 비행하지 않습니다. 그렇다면 그들이 여전히 들어갈 수 있기 때문에, 아이디어는 나의 마스터 페이지 내부에서 체크하는 역할입니다 ... 만약 내가 다른 곳에서한다면, 각 액션에 코드를 넣어야 할 것입니다. . 그리고 여기에서 모두에서 그것을하는 것을 기억하십시오, 은색 총알이 마스터 페이지로 수표/리다이렉션을 넣어서 희망하고 있었다. – BigOmega

관련 문제