2012-07-31 4 views
4

커스텀 모델 바인더가 있는데 인증 쿠키를 확인하고 값을 반환합니다.어떻게 MVC3 마스터 페이지 (_ 레이아웃)에 값을 전달합니까?

public class UserDataModelBinder<T> : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 

     if (controllerContext.RequestContext.HttpContext.Request.IsAuthenticated) 
     { 
      var cookie = 
       controllerContext.RequestContext.HttpContext.Request.Cookies[FormsAuthentication.FormsCookieName]; 

      if (cookie == null) 
       return null; 

      var decrypted = FormsAuthentication.Decrypt(cookie.Value); 

      if (!string.IsNullOrWhiteSpace(decrypted.UserData)) 
       return JsonSerializer.DeserializeFromString<T>(decrypted.UserData); 
     } 

     return null; 
    } 
} 

만약 내가 그것을 사용해야한다면, 나는 그것을 행동에 전달할 필요가있다. 모든 것이 작동합니다.

public ActionResult Index(UserData userData) 
{ 
    AccountLoginWidgetVM model = new AccountLoginWidgetVM(); 
    if (null != userData) 
     model.UserData = userData; 

    return View(userData); 
} 

그러나 일단 사용자 로그인을하면 모든 페이지의 상단에 정보를 표시하기 때문에 마스터 페이지에서 사용하고 싶습니다. 나는 몇 가지를 시도 다음과 같이 우리는 그것을했다가

@Html.RenderPartial("LoginPartial", ???model here??) 
+0

보기에 모델 선언을 포함 시켰습니까? – Yasser

답변

11

일을 얻을 coudln't : masterpages에 대한

  1. 정의 별도의 뷰 모델을.

    public class MasterPageViewModel 
    { 
        public Guid CurrentUserId { get; set; } 
        public string CurrentUserFullName { get; set; } 
    } 
    
  2. 주입 필터 및 필터 제공자가 추가되었습니다.

    public class MasterPageViewModelInjectorFilterProvider: IFilterProvider 
    { 
        public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor) 
        { 
         return new [] {new Filter(new MasterPageViewModelInjectorFilter(), FilterScope.Action, null), }; 
        } 
    
        private class MasterPageViewModelInjectorFilter: IResultFilter 
        { 
         public void OnResultExecuting(ResultExecutingContext filterContext) 
         { 
          var viewResult = filterContext.Result as ViewResult; 
          if (viewResult == null) 
           return; 
    
          if (viewResult.ViewBag.MasterPageViewModel != null) 
           return; 
    
          //setup model whichever way you want 
          var viewModel = new MasterPageViewModel(); 
          //inject model into ViewBag 
          viewResult.ViewBag.MasterPageViewModel = viewModel; 
         } 
    
         public void OnResultExecuted(ResultExecutedContext filterContext) 
         { 
         } 
        } 
    } 
    
  3. 구성 필터 제공 : 마스터에서

    //in Application_Start 
    FilterProviders.Providers.Add(new MasterPageViewModelInjectorFilterProvider()); 
    
  4. 사용 :

    ViewBag.MasterPageViewModel 
    

당신이 좋은 비 결합 구조를 가지고 이쪽으로. 물론 Dependency Injection과 결합 할 수는 있지만, 원하는대로 모든 동작에 대해 작업 필터를 구성하십시오.

+0

+1 프로/우아한 솔루션입니다. – devundef

+0

위대한 솔루션입니다. 정말 고맙습니다. – qinking126

0

이 경우 ViewBag를 사용할 수 있습니다.

public ActionResult Index(UserData userData) 
{ 
    AccountLoginWidgetVM model = new AccountLoginWidgetVM(); 
    if (null != userData) 
     model.UserData = userData; 

    ViewBag.UserData = userData; 
    return View(userData); 
} 


@Html.RenderPartial("LoginPartial", ViewBag.UserData) 

userData가 null이 아니어야합니다. null의 경우, 건네받은 모델은 뷰의 디폴트 모델이됩니다.

관련 문제