0

我是一个非常新的 ASP.NET 开发人员(和 Web 开发人员) ,当按下时,将配置发布到服务器(设置计时器的时间。)并在客户端启动计时器,到期时,它也会向服务器发布已完成的操作。

如果这很容易,请向我解释如何去做这样的事情,如果这不容易,或者更是如此,如果这“不是解决这个问题的好方法”,请向我解释一个更好的架构或设计这个。

4

1 回答 1

1

由于这是客户端的事情,我不会使用 ASP.NET :) 显然它仍然代表服务器端,无论如何:

  1. 具有单个控制器、两个视图和两个相应视图模型的新 ASP.NET MVC 项目。
  2. View 有一个<form>带有计时器<select>或文本框之类的东西。
  3. 控制器有一个动作,它接收 POSTed 表单数据并保存它或其他东西,然后向视图返回 303 响应,该视图具有指定计时器何时结束的隐藏字段,该值应保存在服务器上Session,以防万一用户刷新页面。该值应保存为绝对 UTC 日期时间值。
  4. 客户端有一个简单的客户端脚本,在页面加载时,它会检查这个隐藏字段并使用setTimeout.
  5. 该脚本还包含一个回调函数,该函数将在计时器结束时调用。此回调函数将创建并填充一个隐藏的动态<form>元素,该元素已提交,从而向服务器发出 POST 请求,其中包含一些标识客户端和计时器已过期的标签。然后服务器执行另一个 303 重定向回到原始视图,可能包含给用户的消息或其他内容。

这可能是使用现代技术并避免使用 AJAX 或外部框架(如 jQuery 或 Mootools)所固有的复杂性的最简单方法。请注意我使用 303 重定向而不是将 HTML 响应返回到 POST 请求 - 这是为了用户的利益,因此他们永远不会让浏览器“重新提交表单?” 对话框,还可以防止计时器被重置。

更新:

为什么 3xx 响应良好:

当客户端提交 POST 请求时,网络服务器可以通过直接返回响应或通过 3xx 重定向到另一个页面来响应。直接提供响应的问题在于,就 HTTP 而言,响应的内容(即网页)不是“可访问的”:您无法使用 GET 请求检索相同的内容。这就是为什么当用户按下 F5 或点击刷新以获取已发布的页面时,他们会收到一个消息框,提示他们(用神秘的语言)重新提交表单,但通常如果用户重新提交表单,他们最终会破坏申请,因为他们的数据将被处理两次。这就是严重依赖“回发”的 ASP.NET WebForms 被逐步淘汰的原因。

Javascript

代码看起来像这样:

// bind to this event rather than executing directly because the onload event is only fired after the entire DOM is available. If you run the code immediately then you won't be able to traverse the DOM tree.
window.onload = setUpCallback;

function setUpCallback() {
    var hiddenField = document.getElementByID("someHiddenFieldId");
    var timeStampEnd = parseInt( hiddenField.value ); // this is the number of miliseconds since 1970-Jan-01 00:00
    var timeStampNow = new Date().getTime(); // this also returns a miliseconds-since-1970 value

    var timeToEnd = timeStampEnd - timeStampNow;
    if( timeToEnd > 0 ) {
        window.setTimeout( onTimerEnd, timeToEnd ); // set-up the callback
    }
}

function onTimerEnd() {
    var form = document.createElement("form");
    form.action = "http://mywebsite/uriToSubmitPostTo";
    form.method = "post";
    document.documentElement.appendChild( form );

    var clientField = document.createElement("input");
    clientField.type = "hidden";
    clientField.name = "someFieldName";
    clientField.value = "someValueToIdentifyTheClientOrJustUseSession?";

    form.appendChild( clientField );

    form.submit();
}
于 2013-02-15T01:06:48.117 回答