1

マルチサイト Web サイトを扱うのに役立つ 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 には正しいデータとストアが含まれます。SiteThemes には 1 つのテーマが含まれます。しかし、もう一度ページを更新すると、この Model Binder は古くなっています。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

私はこの問題を解決することができました。ただし、理想的なソリューションではありません。私は次のことを発見しました:

「ModelBinders は、複数のリクエストに対して MVC によって再利用されます。これは、リクエスト スコープよりもライフサイクルが長いため、リクエスト スコープのライフサイクルが短いオブジェクトに依存することは許可されていないことを意味します。」

ソース:カスタム モデル バインダーに依存関係を挿入し、Ninject を使用して InRequestScope を使用する

ライフサイクルの問題を回避するために、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 に答える