2011-02-15 3 views
2

내 최초 발행에 널 (null)을 오는 : 성능 향상을 재 인수 분해 작업으로 시작된 무엇을 ViewData 세트는 여기에 마스터 페이지 MVC3

Help! I've got repository access in my MVC master page! Refactor time!

새로운 문제를 공개했다. 이 질문을 원래 질문에 그대로 적용해야한다면이 질문을 삭제하고 이전 질문의 이름을 더 적절하게 변경하십시오. 일부 사용자 정의 설정을로드하기 위해 기본 컨트롤러에 적용된 ActionFilter를 사용하고 있습니다. 내 문제는 filterContext.Controller.ViewData 개체에 이러한 설정을 저장하지만 내 마스터 페이지에서 null로 처리된다는 것입니다.

액션 필터

public class HomeController : BaseController 
{ 
    // 
    // GET: /Store/Home/ 
    public ActionResult Index() 
    { 
     IProductRepository productRepository = new ProductRepository(); 
     var products = new List<Product>(); 

     IResellerRepository resellerRepository = new ResellerRepository(); 
     var reseller = resellerRepository.GetResellerByUsername(User.Identity.Name); 

     IProductCategoryRepository categoryRepository = new ProductCategoryRepository(); 
     var categories = categoryRepository.GetProductCategoriesFromStoreSettings(reseller.StoreSetting.Categories); 

     foreach(var category in categories) 
     { 
      products.AddRange(productRepository.GetProductsByCategory(category.CategoryId)); 
     } 

     var viewModel = new StoreViewModel() 
          { 
           Products = products.ToList() 
          }; 

     return View(viewModel); 
    } 
} 
,691을 니펫을 HomeController

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] 
public class StoreSettingsActionFilter : ActionFilterAttribute 
{ 
    private readonly IResellerRepository _resellerRepository; 
    private readonly IStoreSettingsRepository _storeSettingsRepository; 

    public StoreSettingsActionFilter(
     IResellerRepository resellerRepository, 
     IStoreSettingsRepository storeSettingsRepository 
    ) 
    { 
     _resellerRepository = resellerRepository; 
     _storeSettingsRepository = storeSettingsRepository; 
    } 

    public StoreSettingsActionFilter() 
     : this(new ResellerRepository(), new StoreSettingsRepository()) 
    { 

    } 

    public override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     base.OnResultExecuted(filterContext); 

     var settingsViewModel = new StoreSettingsViewModel(); 
     settingsViewModel.ThemeLocation = "~/Content/jquery-ui-1.8.9.custom.css"; 
     var user = filterContext.HttpContext.User; 
     if (!user.Identity.IsAuthenticated || !user.IsInRole("Reseller")) 
     { 
      filterContext.Controller.ViewData["storeSettings"] = settingsViewModel; 
      return; 
     } 

     var session = filterContext.HttpContext.Session; 
     var reseller = session["reseller"] as Reseller; 
     if (reseller == null) 
     { 
      reseller = _resellerRepository.GetResellerByUsername(user.Identity.Name); 
      session["reseller"] = reseller; 
     } 

     if (reseller.StoreSettingsID != null && reseller.StoreSetting.Theme != null) 
     { 
      var storeSettings = session["storeSettings"] as StoreSettings; 
      if (storeSettings == null) 
      { 
       storeSettings = _storeSettingsRepository.GetStoreSettings((int)reseller.StoreSettingsID); 
       session["storeSettings"] = storeSettings; 
      } 
      // Using AutoMapper to convert between the model and the view model 
      //settingsViewModel = Mapper.Map<StoreSettings, StoreSettingsViewModel>(storeSettings); 

      settingsViewModel.ThemeLocation = storeSettings.Theme.StylesheetLocation; 
      settingsViewModel.Address1 = storeSettings.Address1; 
      settingsViewModel.Address2 = storeSettings.Address2; 
      settingsViewModel.City = storeSettings.City; 
      settingsViewModel.FooterImage = storeSettings.Image.FileName; 
      settingsViewModel.HeaderImage = storeSettings.Image1.FileName; 
      settingsViewModel.Phone = storeSettings.Phone; 
      settingsViewModel.PostalCode = storeSettings.PostalCode; 
      settingsViewModel.ProvinceCode = storeSettings.Province.Abbreviation; 
      settingsViewModel.StoreName = storeSettings.StoreName; 
     } 
     filterContext.Controller.ViewData["storeSettings"] = settingsViewModel; 
    } 
} 

자료 컨트롤러

[StoreSettingsActionFilter] 
public abstract class BaseController : Controller 
{ 

} 

다음은 관련 코드입니다

마스터 페이지가 정말 여기 붙어있어

<head id="Head1"> <% var storeSettings = (StoreSettingsViewModel)ViewData["storeSettings"]; // This is always ending up null. %> <title> <%: string.IsNullOrEmpty(storeSettings.StoreName) ? "My Store Name" : storeSettings.StoreName%> </title> 

니펫을, 당신의 도움이 크게 감사합니다!

답변

2

시도 StoreSettingsActionFilter 필터 OnActionExecuted를 오버라이드 (override) 대신 OnResultExecuting : 그 것이었다

public override void OnActionExecuted(ActionExecutedContext filterContext) 
{ 
    ... 
} 
+0

! 내가 그 자신을 붙잡을 수 있었 더라면 좋겠다고 생각한다, 나는 다음에 그것을 더 가깝게 읽을 것이다. – Gallen