2011-02-15 54 views
2

我原来这里的问题:在一个ActionFilter ViewData的集出来就空母版页MVC3

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

什么最初是作为一重保工作,以提高性能揭示了新的问题。如果我应该保留原来的问题 - 请随时删除这个问题,并将旧问题重新命名为更相关的问题。我正在使用应用于基础控制器的ActionFilter来加载一些用户自定义设置。我的问题是我将这些设置保存在filterContext.Controller.ViewData对象中,但它在主页面上显示为空。下面是相关代码:

行为过滤

[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 
{ 

} 

HomeController的片断

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); 
    } 
} 

主网页摘要

<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

尝试重写OnActionExecuted而不是OnResultExecutingStoreSettingsActionFilter过滤器:

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

这就是它!希望我自己能够抓住这一点,下次我会更仔细地阅读它。 – Gallen 2011-02-15 22:17:58