내 최초 발행에 널 (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>
니펫을, 당신의 도움이 크게 감사합니다!
! 내가 그 자신을 붙잡을 수 있었 더라면 좋겠다고 생각한다, 나는 다음에 그것을 더 가깝게 읽을 것이다. – Gallen