当我的页面加载时,我使用asp.net帮助器触发了2个不引人注目的Jquery请求,如下所示
<div id="stdReplace">
<form method="get" data-ajax="true" data-ajax-url="/Stats/Index/QuickChart"
data-ajax-failure="PulseTs.HttpUtilsTs.httpRequestFailed"
data-ajax-success="stdOnComplete"
data-ajax-method="get"
data-ajax-begin="PulseTs.VisualHelpersTs.blockElement(stdReplace)"
data-ajax-update="#stdReplace"
data-ajax-mode="REPLACE-WITH"
class="quickChartForm">
<input type="hidden" name="id" value="std"/>
</form>
</div>
</div>
两者均到达正确的处理程序并返回局部视图以更新其所处的父元素 处理程序:
public async Task<IActionResult> OnGetQuickChart(string id)
{
await _serviceStats.GetGeneralStats(routeName, startDate, endDate);
string key = "ssts" + id.First().ToString().ToUpper() + id.Substring(1);
if (string.Equals(id, "avg"))
{
TempData["ChartTitle"] = "avg";
TempData["ChartId"] = "avgChart";
}
else
{
TempData["ChartTitle"] = "std";
TempData["ChartId"] = "stdChart";
}
return new PartialViewResult
{
StatusCode = 200,
ViewName = "Stats/Partial/_QuickChartView",
ViewData = ViewData,
TempData = TempData
};
现在,get GetGeneralTtats函数应该在内部更新服务属性之一,在我调试它时会这样做。但是我也将此服务注入到Razor页面视图中,当我尝试在javascript中检索该属性时,它为空
我将服务插入剃刀页面
@inject IServiceStats ServiceStats
并尝试如下恢复js中的属性
data = @Json.Serialize(ServiceStats.StatsVm.AvgData);
调试时我看到了
但是当我console.log(data)
我明白了
为什么单例服务的属性在应用程序的整个生命周期中都没有更新?
答案 0 :(得分:1)
您已经部分发生在服务器上,部分发生在客户端上。将模型提供给视图,然后在JS中将其设置为data
的值时,这一切都是在服务器端发生的。 data
变量实际上甚至不存在,它只是涉及到所有服务器的文本。您只需将模型的序列化值转储到该位置的页面即可。然后,在返回响应之后,浏览器(客户端)在页面上运行JS,然后data
才被设置为某种对象,该对象此时只是一个JS对象。
当您通过AJAX发出请求时,您可以影响服务器上的模型,但这对客户端已经完成的操作产生了零影响。如果需要更新的数据,则需要向服务器发出专门针对此请求的请求,将该数据作为服务器的响应(JSON)返回,然后使用该JSON响应设置data
JS变量