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>
我真的坚持在这里,你的帮助是非常感谢!
这就是它!希望我自己能够抓住这一点,下次我会更仔细地阅读它。 – Gallen 2011-02-15 22:17:58