2010-08-04 4 views
1

모든 컨트롤러의 모든보기 전에 내 사이트의 마스터 페이지에있는 데이터를 전달하지 않아도되도록 생성자에 데이터를 설정하는 ApplicationController를 만들었습니다. 이 접근 방식의 문제점은 내가 통과해야하는 viewdatas 중 하나가 현재 로그인 한 사용자의 프로필 Image의 URL이라는 것입니다.asp.net mvc 및 MasterData의 ViewData에 대한 도움말

[Authorize(Roles = "Administrator")] 
    public abstract class AdministratorController : Controller 
    { 
     private IPortalAdministratorServices _servicioPortalAdministrator; 
     public AdministratorController() 
     { 
      _servicioPortalAdministrator = new PortalAdministratorServices(); 
      ViewData["associates"] = _servicioPortalAdministrator.getAssociates(); 
      ViewData["picture"] = _servicioPortalAdministrator.GetPic();   

     public AdministratorController(IPortalAdministratorServices service) 
     { 
      _servicioPortalAdministrator = service; 
      } 

    } 

및 관리자 회사 관리자가 상속하는 컨트롤러는 이제 모든보기 호출시 모든 데이터를 설정해야합니다.

[Authorize(Roles = "Administrator")] 
public class CompaniesController : AdministratorController 
{ 
    private ICompaniasServices _service; 

    public CompaniesController() 
    { 
     _service = new CompaniasServices(new ModelStateWrapper(this.ModelState)); 

    } 

    public CompaniesController(ICompaniasServices service) 
    { 
     _service = service; 
    } 

문제는 이것이다 :

내가 수동으로 실제로 방법 GetPic() 실 거예요 실제로 아무도에 기록되는 원인이 사진의 URL을 얻을 수있을 로그인하지 않고 회사 컨트롤러에 액세스하려고 ..이 메소드는 Authorize 속성에도 불구하고 호출됩니다 .... 이제는 그림 URL의 ViewData에 로그인 한 후에도 "unknown.png"로 영구적으로 설정되었습니다.

이 코드 중 일부는 isnt mine .. 나는 방금 버그를 발견했지만 그것을 고칠 방법을 알아낼 수 없다.

답변

0
if (User.Identity.IsAuthenticated){ 
    ViewData["picture"] = _servicioPortalAdministrator.GetPic(); 
} 
else{ 
    ... 
} 

사용할 수 있나요?

0

사이트의 어느 곳에서나 권한을 부여 하시겠습니까? 그렇지 않다면 web.config의 섹션을 놓친 것일 수 있습니까?

+0

예, 모든 생성자 명령을 실행 한 후에 만 ​​리디렉션됩니다. – ignaciofuentes

0

생성자에서 구현을 제거하고이 필터를 추가하면 사용법이 [Authorize (Roles = "Administrator"), AdministratorServices]가됩니다.

public class AdministratorServicesAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      var filter = new AdministratorServicesFilter(new PortalAdministratorServices()); 
      filter.OnActionExecuting(filterContext); 
     } 
    } 

public class AdministratorServicesFilter : IActionFilter 
{ 
    private readonly IPortalAdministratorServices _servicioPortalAdministrator; 

    public AdministratorServicesFilter(IPortalAdministratorServices servicioPortalAdministrator) 
    { 
     _servicioPortalAdministrator = servicioPortalAdministrator; 
    } 

    #region IActionFilter Members 

    public void OnActionExecuted(ActionExecutedContext filterContext) 
    { 

    } 

    public void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     filterContext.Controller.ViewData["associates"] = _servicioPortalAdministrator.getAssociates(); 
     filterContext.Controller.ViewData["picture"] = _servicioPortalAdministrator.GetPic(); 
    } 

    #endregion 
}