2013-01-02 101 views
3

請看下面的動作。當用戶第一次導航時,創建一個對象,然後當他在頁面中導航時,再次訪問Action,但通過Ajax請求和數據消除器(工作表=空)。如何將數據保存在MVC控制器的內存中?

private static List<Worksheet> worksheets; 
    public ActionResult DoTest() 
    { 
     if (Request.IsAjaxRequest()) 
     { 
      return PartialView("_Problems", worksheets[1]); 
     } 

     // first time 
     worksheets = new List<Worksheet>() 
     { 
      new Worksheet("Hoja 1", ...), 
      new Worksheet("Hoja 2", ...) 
     }; 
     return View(worksheets[0]); 
    } 

我的第一個溶液的變量工作表設置爲靜態的,但我認爲這不是一個好的做法。我正在做一個好方法還是有另一個tweeks?

回答

7

遠離靜態變量,尤其是在數據依賴於用戶的情況下。您可以利用ASP.NET Session對象。

通過將您的工作表字段更改爲將其值存儲在會話對象中的屬性,可以輕鬆地完成您的情況。這樣,它將在隨後的電話上可用。例如:

private List<Worksheet> worksheets 
    { 
    get{ return Session["worksheets"] as List<Worksheet>;} 
    set{ Session["worksheets"] = value; } 
    } 

    public ActionResult DoTest() 
    { 
     if (Request.IsAjaxRequest()) 
     { 
     return PartialView("_Problems", worksheets[1]); 
     } 

     // first time 
     worksheets = new List<Worksheet>() 
     { 
      new Worksheet("Hoja 1", ...), 
      new Worksheet("Hoja 2", ...) 
     }; 
     return View(worksheets[0]); 
    } 
+0

謝謝烏利塞斯,它的工作出來了!只是一個答案,它喜歡有趣的如何工作會話字典,想象一下瀏覽器是關閉的。如果瀏覽器關閉,我如何堅持會話直到60分鐘(含)。 –

+1

@DarfZon Session對象的默認值是20分鐘(你可以在配置文件中更改它)。除非您之前清除它,否則即使用戶關閉瀏覽器,它也會在服務器端保持活動狀態;但是,這可能會導致服務器爲用戶分配不同的會話對象(具體取決於您的身份驗證機制) – Ulises

1

控制器的實例不跨請求持久(這就是爲什麼使工作表靜態的作品,但保持它的非靜態的不 - 對象只填充上,由於非AJAX請求到你的if語句)。

一個選項是填充對象,不管請求如何進入,然後使用if語句來決定返回哪個項目。另一個(可能更好的)解決方案是使用會話,如Ulises提到的。

0

在ASP.NET核心會話不支持通用數據類型,你需要添加此擴展

using Microsoft.AspNetCore.Http; 
using Newtonsoft.Json; 

public static class SessionExtensions 
{ 
    public static void Set<T>(this ISession session, string key, T value) 
    { 
     session.SetString(key, JsonConvert.SerializeObject(value)); 
    } 

    public static T Get<T>(this ISession session,string key) 
    { 
     var value = session.GetString(key); 
     return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value); 
    } 
} 

,並使用它:

public IActionResult SetDate() 
{ 
    // Requires you add the Set extension method mentioned in the article. 
    HttpContext.Session.Set<DateTime>(SessionKeyDate, DateTime.Now); 
    return RedirectToAction("GetDate"); 
} 

public IActionResult GetDate() 
{ 
    // Requires you add the Get extension method mentioned in the article. 
    var date = HttpContext.Session.Get<DateTime>(SessionKeyDate); 
    var sessionTime = date.TimeOfDay.ToString(); 
    var currentTime = DateTime.Now.TimeOfDay.ToString(); 

    return Content($"Current time: {currentTime} - " 
       + $"session time: {sessionTime}"); 
} 
相關問題