【问题标题】:How to pass a string on page refresh?`如何在页面刷新时传递字符串?`
【发布时间】:2015-10-06 09:09:49
【问题描述】:

我遇到了这样的问题。

场景:

在运行我的操作时,我使用一个 int 数组根据这些 ID 检索数据。在您到达视图之前,这非常有效。我设法很好地检索数据,但每当我刷新页面时,由于数组是一种复杂类型,它在操作中作为 null 出现。为了解决这个问题,我将数组转换为字符串,并希望将此值传递给页面刷新操作。但是到目前为止我尝试过的所有内容实际上都没有提交值,参数肯定会被填充。我要传入的参数是RPString

行动:

[AuthorizeClientID]
        [LoggingFilter]
        public ActionResult SupplierReportSelection(int ClientID, int[] ReviewPeriodID, string RPString, int? GroupID, int? SupplierID = null, bool? Backbtn = null, int? StatusCategoryID = null) {
            if (TempData["TempReviewPeriod"] != null) {
                ReviewPeriodID = (int[])TempData["TempReviewPeriod"];
            }
            ClaimsBySupplierViewModel SupplierModel = ClaimsBySupplier(ClientID, ReviewPeriodID, SupplierID, GroupID);

            ViewBag.client = client;


            return View("ClaimsBySupplier", SupplierModel);
        }

查看:

 @if (Model.ReportData.Any()) {
            Model.RPString = string.Join(",", Model.inputReviewPeriodIDs);
            Model.RPString = Json.Encode(Model.RPString);          
     //Removed code which isn't needed
        }

如果 JQuery 也是一种可能性,请告诉我。

【问题讨论】:

  • 第一次成功请求时如何填充数组?
  • @WiktorZychla 该数组填充了一个下拉列表,具体取决于用户单击的值
  • 不是我的意思。我的问题是:该列表是在 GET 请求的查询字符串中传递的,还是更确切地说,这是一个 POSTed 值列表?无论如何,您是否想过将其存储在 Session 中,以便当它为空时您可以从 Session 中检索它?
  • 嗯,不,我没想过将它存储在会话中,例如 cookie。这是一个很好的观点。我想这会奏效。在此期间我一直很忙,但我会更新并在我修复它时通知您:) 谢谢
  • @WiktorZychla 非常感谢您的建议。问题已解决:)

标签: c# .net asp.net-mvc razor


【解决方案1】:

jQuery 有unload 方法,当用户离开页面时调用该方法。

例如,您可以执行以下操作:

$( window ).unload(function() {
    $.ajax({
        method: "<method>",
        url: "<your url>",
        data: { RPString: <your desired value> }
    })
});

【讨论】:

  • 我是否需要将参数传递给 URL,然后尝试在操作中检索它?
  • @AndrewKilburn,在这个unload 回调中,您可以向&lt;host and controller names here&gt;/SupplierReportSelection 发出ajax 请求并传递您的RPString 参数。 (如果我正确理解了你的问题)
【解决方案2】:
   [AuthorizeClientID]
        [LoggingFilter]
        public ActionResult SupplierReportSelection(int ClientID, int[] ReviewPeriodID, string RPString, int? GroupID, int? SupplierID = null, bool? Backbtn = null, int? StatusCategoryID = null) {
            if (GroupID == null && SupplierID == null && TempData["TempReviewPeriod"] != null) {
                ReviewPeriodID = (int[])TempData["TempReviewPeriod"];

                //The cookie code is used for the page refresh whenever a user performs a search with multiple ReviewPeriod IDs. This is because you cannot pass the ReviewPeriodID array in the URL.
                Request.Cookies.Remove("RPCookie");
                HttpCookie RPCookie = new HttpCookie("RPCookie");
                for (int i = 0; i < ReviewPeriodID.Length; i++) {
                    if (ReviewPeriodID.Length - 1 != i) {
                        RPCookie.Value += ReviewPeriodID[i] + ",";
                    }
                    else {
                        RPCookie.Value += ReviewPeriodID[i];
                    }
                }
                Response.Cookies.Set(RPCookie);
            }
            else if (GroupID == null && SupplierID == null && TempData["TempReviewPeriod"] == null) {
               ReviewPeriodID = Request.Cookies.Get("RPCookie").Value.Split(',').Select(n => Convert.ToInt32(n)).ToArray();

            }

            ClaimsBySupplierViewModel SupplierModel = ClaimsBySupplier(ClientID, ReviewPeriodID, SupplierID, GroupID);

            ViewBag.client = client;

            return View("ClaimsBySupplier", SupplierModel);
        }

我接受了上面 Wiktor Zychla 的建议,并使用 cookie 来存储数据。每次 TempData 中有数据时,我都会删除 cookie 并重新创建 cookie。然后,如果 TempData 为空(它将在页面刷新时出现),我将获取 cookie 并将其转换为我的参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    相关资源
    最近更新 更多