【问题标题】:Problem with AJAX, JavaScript, ASP.Net MVCAJAX、JavaScript、ASP.Net MVC 的问题
【发布时间】:2010-10-03 21:19:15
【问题描述】:

大家好!

  • 我正在编写 Asp.Net MVC 2 站点。
  • 我有 TimeController 和 TimeView,CountDownHelper 用于 TimeView 页面上的渲染时间。
  • 我还有更新当前时间的 JavaScript,用于 CountDownHelper。

我需要从此 JavaScript 调用 AJAX 以获取服务器上的当前时间。 我该怎么做?请帮我!我必须完成大约几个小时!

您可能会在下面看到这个 javaScript,最后我尝试调用 AJAX。我曾尝试以多种方式编写 GetServerTime.html,但其中任何一种方式都行不通。 (((

 //countDown.js  
function calcage(secs, num1, num2) 
{
    s = ((Math.floor(secs / num1)) % num2).toString();
    if (LeadingZero && s.length < 2)
        s = "0" + s;
    return "<b>" + s + "</b>";
}

function CountBack(secs) 
{
    if (secs < 0) 
    {
        location.reload(true);
        document.getElementById("cntdwn").innerHTML = FinishMessage;
        return;
    }

    //difference between recieve time and current client time
    diff = new Date(new Date() - clientTime);
    targetD = new Date(TargetDate);
    serverD = new Date(serverDate);
    currentServerDate = new Date(serverD.getTime() + diff.getTime());

//targetD
    leftD = new Date(targetD.getTime() - currentServerDate.getTime());

    secs = leftD.getTime() / 1000;

    DisplayStr = DisplayFormat.replace(/%%D%%/g, calcage(secs, 86400, 100000));
    DisplayStr = DisplayStr.replace(/%%H%%/g, calcage(secs, 3600, 24));
    DisplayStr = DisplayStr.replace(/%%M%%/g, calcage(secs, 60, 60));
    DisplayStr = DisplayStr.replace(/%%S%%/g, calcage(secs, 1, 60));

    document.getElementById("cntdwn").innerHTML = DisplayStr;
    if (CountActive)
        setTimeout("CountBack(" + (secs + CountStepper) + ")", SetTimeOutPeriod);
}

function putspan(backcolor, forecolor) 
{
    document.write("<span id='cntdwn' style='background-color:" + backcolor +
                "; color:" + forecolor + "'></span>");
}

if (typeof (BackColor) == "undefined")
    BackColor = "white";
if (typeof (ForeColor) == "undefined")
    ForeColor = "black";
if (typeof (TargetDate) == "undefined")
    TargetDate = "12/31/2020 5:00 AM";
if (typeof (serverDate) == "undefined")
    serverDate = "12/31/2020 5:00 AM";
if (typeof (DisplayFormat) == "undefined")
    DisplayFormat = "%%D%% Days, %%H%% Hours, %%M%% Minutes, %%S%% Seconds.";
if (typeof (CountActive) == "undefined")
    CountActive = true;
if (typeof (FinishMessage) == "undefined")
    FinishMessage = "";
if (typeof (CountStepper) != "number")
    CountStepper = -1;
if (typeof (LeadingZero) == "undefined")
    LeadingZero = true;


CountStepper = Math.ceil(CountStepper);
if (CountStepper == 0)
    CountActive = false;
var SetTimeOutPeriod = (Math.abs(CountStepper) - 1) * 1000 + 990;
putspan(BackColor, ForeColor);
var dthen = new Date(TargetDate);
var dtServ = new Date(serverDate);
var dnow = new Date();
if (CountStepper > 0)
    ddiff = new Date(dnow - dthen);
else
    ddiff = new Date(dthen - dtServ);
    //ddiff = new Date(TargetDate - serverDate);
//ddiff = new Date(dthen - dnow);
gsecs = Math.floor(ddiff.valueOf() / 1000);
CountBack(gsecs);

alert("Start");
alert(serverDate);

//AJAX CALL ???? 
//How to call async JavaScript?
//Which must be GetServerTime.html

$.get('Views/GetServerTime.html', function(data) {
    serverDate = data;
    clientTime = new Date();    
});

alert(serverDate);**

【问题讨论】:

  • “异步 JavaScript”是什么意思?
  • 异步调用JavaScript,即不刷新所有页面

标签: javascript asp.net-mvc ajax


【解决方案1】:

通常您不会直接访问您的视图。并且视图通常是一个 .ASPX 文件。

所以

$.get('Views/GetServerTime.html',...

变成

$.get('/GetServerTime/',...

对于 Views/GetServerTime/Index.aspx 视图和默认操作为 IndexgetserverTimeController.cs 控制器。

但我猜这不是您遇到的唯一问题?...

编辑

您也应该为此使用 JSON。您可以使用System.Web.Mvc.JsonResult 自动将您的结果作为 JSON 发送,jQuery 将处理此 JSON 并将其转换为 javascript 对象。

        $.get('/GetServerTime/', 
                        function (data)
                        {
                                if (data.HasError == false)
                                {
                                    $("#resultDiv").html(data.ServerTime);
                                }
                        }, "json");

您的 MVC 操作可能如下所示...

public JsonResult Index(string id)
{
    JsonResult res = new JsonResult();          
    res.JsonRequestBehavior = JsonRequestBehavior.AllowGet;

    res.Data = new { ServerTime = DateTime.Now(), HasError = false };

    return res;
}

以上是近似值,因为我没有编译器。

【讨论】:

  • 是的,一定是GetServerTime这个页面?
  • 你好 Roman,视图文件夹通常映射到 controller,视图名称映射到 action。默认操作通常是Index,因此是Index.aspx。这一切都可以很容易地改变。
  • $.get('Views/GetServerTime.html', function(data) { serverDate = data; clientTime = new Date(); });这段代码正确吗?
  • 查看我的最新更新以获得一个想法。您不应该直接调用视图,您需要调用控制器,而不是视图。在您的特定情况下,您甚至不需要视图,因为您返回 JSON。
  • 是的,我可以用 JavaScript 编写 $.get(...) 吗?因为我遇到了错误:Microsoft JScript runtime error: '$' is undefined ?
【解决方案2】:

首先,我不确定“GetServerTime.html”能否成功为您提供当前时间。你确定它是你想要的页面的名称吗?除非您将路由设置为处理该 URL 模式。正如 Kervin 在下面所说的那样。

此外,“function(data)”方法的主体是 ajax 函数返回时调用的回调。

至于返回服务器日期/时间的页面,您需要决定它将返回什么格式:XML 或 JSON。然后你的控制器会返回它。

public class DateController : Controller {
    public ActionResult CurrentDate()
    {
       var returnJson = new 
          {
              currentDate = DateTime.Now.ToString()
          }

       return Json(returnJson, JsonRequestBehavior.AllowGet);
    }
}

那么您的 .get 函数将如下所示:

$.get('/Date' function(data) {
    theDate = data.currentDate;
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-24
    • 2011-09-21
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多