我有一个Model Binder来帮助处理多站点网站。每个StoreObject都有一个SiteThemes集合。
public class StoreObject
{
.......
public virtual ICollection<SiteTheme> SiteThemes { get; set; }
}
然后,我将调用一个使用新主题更新数据库的存储库对象。
public void SaveAndSetSiteTheme(SiteTheme t)
{
context.SiteThemes.Where(f => f.StoreObjectID == t.StoreObjectID).ToList().ForEach(p => p.Active = false);
if (t.SiteThemeID == 0)
{
t.Active = true;
context.SiteThemes.Add(t);
}
context.SaveChanges();
}
完成后,下面的Model Binder有正确的数据和store.SiteThemes将有1个主题。但是,当我再次刷新页面时,此模型绑定器已过期。 store.SiteThemes集合恢复到原始状态并为空。我不知道到底发生了什么。如果需要更多信息,请帮助或告诉我。
public class StoreModelBinder : IModelBinder
{
private const string sessionKey = "Store";
private IStoreObjectRepository storeRepository;
public StoreModelBinder()
{
storeRepository = new StoreObjectRepository();
}
public object BindModel(ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
Uri url = HttpContext.Current.Request.Url;
string dom = url.Host;
StoreObject store = storeRepository.Stores.FirstOrDefault(s => s.MainURL == dom);
if (store != null)
HttpContext.Current.Session[sessionKey] = store;
return store;
}
}
答案 0 :(得分:2)
我设法解决了这个问题。虽然,没有一个理想的解决方案。我发现了以下内容:
“ModelBinder由MVC重用于多个请求。这意味着它们的生命周期比请求范围更长,因此不允许依赖于请求范围生命周期较短的对象。”
来源:Inject a dependency into a custom model binder and using InRequestScope using Ninject
我只是在BindModel中添加了一个新的StoreObjectRepository实例,以便超越生命周期问题。我认为这是一个黑客,并希望在不久的将来更新此代码。
public class StoreModelBinder : IModelBinder
{
private const string sessionKey = "Store";
private IStoreObjectRepository storeRepository;
public StoreModelBinder()
{
storeRepository = new StoreObjectRepository();
}
public object BindModel(ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
storeRepository = new StoreObjectRepository();
Uri url = HttpContext.Current.Request.Url;
string dom = url.Host;
StoreObject store = storeRepository.Stores.FirstOrDefault(s => s.MainURL == dom);
if (store != null)
HttpContext.Current.Session[sessionKey] = store;
return store;
}
}