在razor中从javascript访问对象

在razor中从javascript访问对象,javascript,c#,razor,asp.net-core-mvc,Javascript,C#,Razor,Asp.net Core Mvc,我需要在应用程序中移动此对象而不会丢失它。起初,我只是使用一个静态类来实现它,它简单、快速、有效。不过,我注意到,任何人都可以从任何地方访问静态对象。因此,由于这是一个严重的安全风险,我一直在试图找到另一种方法。我已经发出了一个ajax请求,以执行代码隐藏中需要执行的操作(在本例中,就是在酒店预订一个新房间)。一切都好。问题是,我想把它带回到客户端、模型或其他地方,以便在我需要预订另一个房间时展示。现在,我单击“book”按钮,它会添加一个房间,但一旦它返回到客户端,对象就丢失了。因此,我在服务

我需要在应用程序中移动此对象而不会丢失它。起初,我只是使用一个静态类来实现它,它简单、快速、有效。不过,我注意到,任何人都可以从任何地方访问静态对象。因此,由于这是一个严重的安全风险,我一直在试图找到另一种方法。我已经发出了一个ajax请求,以执行代码隐藏中需要执行的操作(在本例中,就是在酒店预订一个新房间)。一切都好。问题是,我想把它带回到客户端、模型或其他地方,以便在我需要预订另一个房间时展示。现在,我单击“book”按钮,它会添加一个房间,但一旦它返回到客户端,对象就丢失了。因此,我在服务器端序列化了它,并将其返回到服务器端。但是我无法在razor代码中访问它

我不知道这是否能做到(至少这样)。但必须有另一种方式,因为许多网站必须进行销售,例如,交换页面并保留所有信息。如果可能的话,我希望避免为了做这件事而不得不一直访问数据库。我想把这个留在记忆中

因此,要显示代码:

<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) });
        }
    }

书
函数AjaxRooms(URL、方法、内容类型、请求、数据类型、successRespMsg、successRespObj){
$.ajax({
url:url,
方法:方法,,
contentType:contentType,
数据:JSON.stringify(请求),
数据类型:数据类型,
成功:功能(resp){
调试器
警报(resp[successRespMsg]);
var aux=JSON.parse(resp[successRespObj]);
//这里是我想从javascript访问razor对象的地方,以便将其保存在内存中
},
错误:函数(错误){
警报(错误);
}
})
}
功能书房(模型、roomUUID、rateUUID、登记入住、结账){
AjaxRooms('Home/Book?ro='+roomUUID+'&ra='+rateUUID+'&ci='+document.getElementById(签入).value+'&co='+document.getElementById(签出).value,
‘post’、‘application/json’、‘model’、‘json’、‘msg’、‘obj’;
}
公务舱预订
{
公共日期时间签入{get;set;}
公共日期时间签出{get;set;}
public List BookedRooms{get;set;}=new List();
}
公共IActionResult Book([FromBody]预订)
{
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();
尝试
{
如果(签入=“”| |签出=“”)
返回Json(new{msg=“您必须选择签入和签出日期。”,obj=JsonConvert.SerializeObject(reservation)});
else if(roomUUID!=“rateUUID!”)
{
//将新房间(以指定的速率)添加到列表中
var roomType=Repository.DeepClone(Repository.RoomTypeList)
.FirstOrDefault(r=>r.UUID==roomUUID);
roomType.PossibleRateTypes=新列表(){roomType.PossibleRateTypes.FirstOrDefault(rt=>rt.UUID==rateUUID)};
预订。预订房间。添加(房间类型);
reservation.CheckIn=Convert.ToDateTime(签入);
reservation.CheckOut=Convert.ToDateTime(签出);
返回Json(new{msg=“Added to cart.”,obj=JsonConvert.SerializeObject(reservation)});
}
其他的
返回Json(new{msg=“我们无法将其添加到购物车。请重试。”,obj=JsonConvert.SerializeObject(保留)});
}
捕获(例外情况除外)
{
返回Json(new{msg=“出现错误。请稍后重试,或与管理员联系。”,obj=JsonConvert.SerializeObject(保留)});
}
}

我一直在这样做,但你可以提出另一种更好的方法。我洗耳恭听。

您考虑过在浏览器中使用存储吗?当用户在您的站点上从一页跳到另一页时,这是将数据保存在内存中的一种方法。

您是否考虑过在浏览器中使用本地/会话存储?当用户在您的站点上从一页跳到另一页时,这将是将数据保存在内存中的一种方法?陛下可能有用。这个过程和我现在做的一样吗?Ajax请求在服务器端进行处理并返回json,然后,如果我理解正确,我可以将其保存在存储器中。你认为这样行吗?小提示:并非所有浏览器都支持本地存储。如果您想获得完全的跨浏览器支持,您需要使用服务器端会话状态和post,并通过ajax获取。这取决于IE的版本,但是的,大多数(如果不是所有)最新浏览器都可以。@CalC,由于项目非常开放(正如在“不固定的想法”中),这足以满足我的需要。如果在未来,有更好的事情发生,那就太好了。如果不是,这是好东西。:)正如我之前所说,谢谢你的提示。这是一种保存非敏感信息的好方法,而且不必担心在页面之间跳转时数据丢失。:)