7

请看下面的动作。当用户第一次导航时,创建一个对象,然后当他在页面中导航时,再次访问 Action,但通过 Ajax 请求和数据消散器(工作表 = null)。

    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?

4

3 回答 3

10

远离静态变量,尤其是在数据依赖于用户的情况下。您可以利用ASP.NET Session对象。

这可以通过将工作表字段更改为将其值存储在 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]);
  }
于 2013-01-02T19:34:58.233 回答
1

您的控制器的实例不会在请求之间持续存在(这就是为什么使工作表静态工作,但保持非静态不会 - 由于您的 if 语句,该对象仅在非 AJAX 请求中填充)。

一种选择是无论请求如何进入都填充对象,然后使用 if 语句来决定返回哪个项目。正如 Ulises 所提到的,另一个(可能更好)的解决方案是使用会话。

于 2013-01-02T19:36:09.610 回答
0

在 ASP.NET Core Session 不支持通用数据类型中,您需要添加此扩展

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}");
}
于 2017-10-31T08:34:01.163 回答