我有一个用ASP.NET编写的网页,我需要在Page_Load
检索最终用户的本地时间。我想过使用Javascript来获取本地时间(使用new Date()
),但问题是脚本是在服务器事件之后运行的。
关于如何实现这一目标的任何想法?
编辑:我的页面非常复杂:它显示的图表包含来自数据库,对象/字段选择列表等的大量计算字段;客户现在要求它考虑用户的时区,并且应该由网页自动确定时区。用户日期对于确定图表间隔(显示数据的那一天)非常重要。 数据加载(因为它非常复杂)在Page_Load
和Page_PreRender
中完成。放弃这些事件需要整页重写。
ANSWER启发的最终解决方案: 这是我最终解决问题的方法。我将当地日期保存在cookie中。以下是设置cookie的方法:
function SetLocalDateCookie() {
var cookieName = 'LOCALDATE';
var localDate = new Date();
var realMonth = localDate.getMonth() + 1;
var localDateString = localDate.getFullYear() + "/" + realMonth + "/" + localDate.getDate();
setCookie(cookieName, localDateString, 2);
try {
var exdate = new Date();
exdate.setDate(exdate.getDate() + 2);
document.cookie = cookieName + "=" + escape(localDateString) + ";expires=" + exdate.toGMTString();
}
catch (e)
{ }
}
在我的母版页面中,我在$(document).ready
上调用此方法。
在我使用此cookie的页面上,我将以下代码添加到Page_Init
:
if (string.IsNullOrEmpty(CookieHandler.Instance.GetCookie(CookieKeys.LocalDate)))
{
Response.ClearContent();
Response.Write(@"<form id='local' method='post' name='local'>
<script type='text/javascript'>
SetLocalDateCookie();
document.getElementById('local').submit();
</script>
</form>");
Response.Flush();
Response.End();
}
然后我可以在C#代码中使用cookie值。 感谢您的回答/评论!
答案 0 :(得分:4)
我将解释一下以下代码以及你要做的事情。
在第一次请求离开此页面时,代码检查LocalTime是否尚未存储在Session中,如果没有,它将写入一个表单元素,一个隐藏的输入和一个javascript,它将使用本地时间发布该表单。响应结束,因此您的报告无法获得生成的机会。
此提交将立即使用localTime设置创建POST请求,然后ASP .Net将此POST值存储到会话中。
由于可用性,我还在原始页面中添加了302重定向(Response.Redirect)。用户最初做了一个GET请求,而不是POST,所以如果他/她想刷新页面,浏览器将重复最后一个动作,即form.submit()而不是GET请求。
您现在有当地时间。但是,您不必在每次请求时阅读它,因为它可以与UTC时间进行比较,然后与服务器的时间进行比较。
编辑:您需要将UTC时间解析为DateTime,但可能很容易找到格式,但可能取决于用户的文化(不确定)关于这个声明)。
public ReportPage()
{
this.Init += (o, e) =>
{
// if the local time is not saved yet in Session and the request has not posted the localTime
if (Session["localTime"] == null && String.IsNullOrEmpty(Request.Params["localTime"]))
{
// then clear the content and write some html, a javascript code which submits the local time
Response.ClearContent();
Response.Write(@"<form id='local' method='post' name='local'>
<input type='hidden' id='localTime' name='localTime' />
<script type='text/javascript'>
document.getElementById('localTime').value = new Date();
document.getElementById('local').submit();
</script>
</form>");
//
Response.Flush();
// end the response so PageLoad, PagePreRender etc won't be executed
Response.End();
}
else
{
// if the request contains the localtime, then save it in Session
if (Request.Params["localTime"] != null)
{
Session["localTime"] = Request.Params["localTime"];
// and redirect back to the original url
Response.Redirect(Request.RawUrl);
}
}
};
}
答案 1 :(得分:0)
我不认为这是可能的,你无法在服务器端从客户端的本地机器上获得时间。
实现这一目标的唯一方法是使用一些javascript(因为这是基于客户端的,所以它将使用客户端的当前日期/时间)。但正如您所说,这将是在您的服务器事件运行之后,您的网页已呈现为HTML并发送到客户端。
一种替代方法是在回发之前捕获客户端时间,但是无法使用初始值Page_Load
执行此操作。
答案 2 :(得分:0)
如何在页面上放置一个隐藏的文本框,在C#中附加一个OnChange-eventhandler并使用OnLoad JavaScript函数将值设置为客户端所需的值?
答案 3 :(得分:0)
据我所知,没有任何方法可以在Page_Load
事件中获取用户本地时间,因为它在服务器端执行,因此只知道服务器的当地日期时间。
要获取用户的本地时间,您需要在JavaScript加载页面时执行对服务器的异步调用,或者将本地时间存储在隐藏字段中,然后在回发后读取。
答案 4 :(得分:0)
或者只使用包含js的插页式页面来获取本地时间并重定向到当前页面,通过查询字符串或会话变量传递时间信息或发布