Асинхронные запросы в ASP.NET MVC при работе с сессионными и частичными представлениями - PullRequest
0 голосов
/ 12 ноября 2018

В моем приложении ASP.net несколько запросов AJAX к действию контроллера LoadPartialView загружают частичное представление непосредственно внутри основного представления.

 public ActionResult LoadPartialView(string triggerParameter)
 {
        var myObject = GetData(triggerParameter);
        SaveObjectToSession(myObject);
        return PartialView("_PartialViewName", myObject);  
 }

 public void SaveObjectToSession(object myObject)
 {           
        _httpContextAccessor.HttpContext.Session.Set("objectKey", ValueToBytes(myObject));
 }

Мое намерение состоит в том, чтобы повторно использовать данные, возвращаемые каждым вызовом LoadPartialView, в другом действии контроллера. Я пытаюсь сделать это с помощью HttpContext.Session, но это не похоже на работу.

  public ActionResult Details(string triggerParameter)
  {
        if (_httpContextAccessor.HttpContext.Session.Get(triggerParameter) == null)
        {
            return RedirectToAction(nameof(Index));
        }
        ....
  }

Я пытался использовать оператор блокировки в LoadPartialView следующим образом:

 private static readonly object Lock = new object();

 public ActionResult LoadPartialView(string triggerParameter)
 {
        lock(Lock) {
            var myObject = GetData(triggerParameter);
            SaveObjectToSession(myObject);
            return PartialView("_PartialViewName", myObject); 
        } 
 }

но это тоже не работает.

Можно ли повторно использовать данные, возвращенные методом действия частичного просмотра, в другом действии контроллера без необходимости дважды запрашивать: GetData ()?

1 Ответ

0 голосов
/ 12 ноября 2018

Этот ответ объясняет, что вы не можете использовать Session с асинхронными вызовами, поэтому вы можете реализовать свой собственный кеш, что-то вроде этого:

public class MyController : Controller
{
    private static object _lock = new object();
    private static Dictionary<string, MyType> MyCache = new Dictionary<string, MyType>();

    public ActionResult Action1(string triggerParameter)
    {
        // get data in action1
        string userUniqueKey = GetUserId(); // <-- get a unique key for this user
        var myObject = GetDataFromCache(triggerParameter, userUniqueKey);
    }

    public ActionResult Action2(string triggerParameter)
    {
        string userUniqueKey = GetUserId(); // <-- get a unique key for this user
        var myObject = GetDataFromCache(triggerParameter, userUniqueKey);
    }

    // if data is already cached, get it from cache otherwise call GetData()
    private MyType GetDataFromCache(string triggerParameter, string userKey)
    {
        lock (_lock)
        {
            if (MyCache.Contains(userKey))
            {
                return MyChache[userKey]; 
            } 
            else 
            {
                myTypeObject = GetData(triggerParameter);      
                MyCache.Add(userKey, myObjectType);
                return myTypeObject;
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...