7

以下のアクションをご覧ください。ユーザーが最初にナビゲートするときにオブジェクトを作成し、次にページ内をナビゲートしている間に、アクションに再度アクセスしますが、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]);
    }

私の最初の解決策は、変数ワークシートを静的に設定することでしたが、これは良い習慣ではないと思いました。私は良い方法をやっていますか、それとも別の週がありますか?

4

3 に答える 3

10

特にデータがユーザーに依存している場合は、静的変数に近づかないでください。ASP.NETSessionオブジェクトを利用できます。

これは、ワークシートフィールドを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リクエストでのみ入力されます)。

1つのオプションは、リクエストがどのように受信されても​​オブジェクトにデータを入力し、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 に答える