【问题标题】:Access object from javascript in razor从剃刀中的javascript访问对象
【发布时间】:2017-12-13 16:48:54
【问题描述】:

我需要在应用程序中移动这个对象而不丢失它。一开始我只是用一个静态类来做,简单、快速、有效。不过,我注意到静态对象可以被任何地方的任何人访问。因此,由于这是一个严重的安全风险,我一直在尝试寻找另一种方法来做到这一点。我已经提出了一个 ajax 请求,要求在后面的代码中执行需要执行的操作(在这种情况下,将是在酒店预订一个新房间)。都好。问题是,我想将它再次带回客户端、模型或其他东西,以便在我需要预订另一个房间时使用。到目前为止,我单击“预订”按钮并添加了一个房间,但是一旦它返回客户端,对象就会丢失。因此,我在服务器端对其进行了序列化,并将其返回给服务器端。但是后来我无法在剃须刀代码中访问它。

我不知道这是否可以做到(至少是这样)。但必须有另一种方式,因为许多网站必须进行销售,例如,切换页面并保留所有信息。如果可能的话,我想避免必须一直访问数据库来执行此操作。我想把它记在心里。

所以,显示代码:

<button type="reset" class="btn btn-info center-block" onclick='BookRoom(
      @Html.Raw(Json.Serialize(Model)),                                                
      "@Repository.RoomTypeList[i].UUID",
      "@Repository.RoomTypeList[i].PossibleRateTypes[j].UUID",
      "checkIn",
      "checkOut");'>
       Book
</button>

<script type="text/javascript">
    function AjaxRooms(URL, method, contentType, request, dataType, successRespMsg, successRespObj) {
        $.ajax({
            url: URL,
            method: method,
            contentType: contentType,
            data: JSON.stringify(request),
            dataType: dataType,
            success: function (resp) {
                debugger
                alert(resp[successRespMsg]);
                var aux = JSON.parse(resp[successRespObj]);

                // Here is where I want to access the object from javascript to razor, in order to keep it in memory

            },
            error: function (error) {
                alert(error);
            }
        })
    }

function BookRoom(model, roomUUID, rateUUID, checkIn, checkOut) {
    AjaxRooms('Home/Book?ro=' + roomUUID + '&ra=' + rateUUID + '&ci=' + document.getElementById(checkIn).value + '&co=' + document.getElementById(checkOut).value,
            'post', 'application/ json', model, 'json', 'msg', 'obj');    
}
</script>



public class Reservation
{
    public DateTime CheckIn { get; set; }
    public DateTime CheckOut { get; set; }

    public List<RoomType> BookedRooms { get; set; } = new List<RoomType>();
}

    public IActionResult Book([FromBody]Reservation reservation)
    {
        var roomUUID = HttpContext.Request.Query["ro"].ToString();
        var rateUUID = HttpContext.Request.Query["ra"].ToString();
        var checkIn = HttpContext.Request.Query["ci"].ToString();
        var checkOut = HttpContext.Request.Query["co"].ToString();

        try
        {
            if (checkIn == "" || checkOut == "")
                return Json(new { msg = "You have to select a Check In and a Check Out date.", obj = JsonConvert.SerializeObject(reservation) });
            else if (roomUUID != "" || rateUUID != "")
            {
                // Adds a new room (with the specified rate) to the list
                var roomType = Repository.DeepClone(Repository.RoomTypeList)
                    .FirstOrDefault(r => r.UUID == roomUUID);

                roomType.PossibleRateTypes = new List<RateType>() { roomType.PossibleRateTypes.FirstOrDefault(rt => rt.UUID == rateUUID) };

                reservation.BookedRooms.Add(roomType);
                reservation.CheckIn = Convert.ToDateTime(checkIn);
                reservation.CheckOut = Convert.ToDateTime(checkOut);

                return Json(new { msg = "Added to cart.", obj = JsonConvert.SerializeObject(reservation) });
            }
            else
                return Json(new { msg = "We couldn't add it to cart. Please try again.", obj = JsonConvert.SerializeObject(reservation) });

        }
        catch (Exception ex)
        {
            return Json(new { msg = "An error has occurred. Please try again later or contact and administrator.", obj = JsonConvert.SerializeObject(reservation) });
        }
    }

我一直这样做,但您可以提出另一种更好的方法来做到这一点。我全神贯注。

【问题讨论】:

  • 您是否考虑过在浏览器中使用本地/会话存储?当用户在您的网站上从一个页面跳转到另一个页面时,这将是一种将数据保存在内存中的方法。
  • 你保存json而不是作为对象访问模型?嗯...可能会工作。这个过程会和我正在做的一样吗? Ajax 请求在服务器端进行处理并返回 json,然后,如果我理解正确,我可以将其保存在存储中。你觉得这样行吗?
  • 小提示:并非所有浏览器都支持本地存储。如果你想要完整的跨浏览器支持,你需要使用服务器端会话状态和 post 并通过 ajax 获取。
  • 取决于 IE 的版本,但是是的,大多数最新的浏览器都可以。
  • @CalC,因为该项目还非常开放(如在不固定的想法中),这对于我的意图来说已经足够了。如果将来有更好的事情出现,那就太好了。如果没有,这是个好东西。 :)

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


【解决方案1】:

您是否考虑过在浏览器中使用local/session 存储?当用户在您的网站上从一个页面跳转到另一个页面时,这将是一种将数据保存在内存中的方法。

【讨论】:

  • 正如我之前所说,感谢您的提示。这是一种很好且干净的方式来保留非敏感信息,并且不用担心在页面之间跳转时数据会丢失。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-01
相关资源
最近更新 更多