1

我有一个模型活页夹来帮助处理多站点网站。每个 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();

}

完成后,下面的模型绑定器具有正确的数据和 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;
    }
}
4

1 回答 1

2

我设法解决了这个问题。虽然,没有一个理想的解决方案。我发现了以下内容:

“MVC 为多个请求重用 ModelBinders。这意味着它们的生命周期比请求范围更长,因此不允许依赖具有较短请求范围生命周期的对象。”

来源:将依赖项注入自定义模型绑定器并使用 InRequestScope 使用 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;
    }
}
于 2012-06-21T17:00:32.403 回答