【发布时间】: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