实体未在模型Binder中更新

时间:2012-06-21 16:26:58

标签: c# asp.net .net asp.net-mvc asp.net-mvc-3

我有一个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;
    }
}

1 个答案:

答案 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;
    }
}