-2

我的视图中有一个名为“divStatus”的 div 项目,我想从控制器更新它,我的意思是,我想将信息附加到 div 中的现有内容,所以我从控制器执行:

        [HttpPost]
        public ActionResult PerformDiagnostic(TestsModel model)
        {
            var script = "$('#divStatus').append('hello World!');";
            return JavaScript(script);
        }

好的,这工作得很好,但是当我想做一些更复杂的事情时它就不起作用了,例如,想象下面的例子:

  [HttpPost]
    public ActionResult PerformDiagnostic(TestsModel model)
    {
        var script = string.Empty;
        for (int i = 0; i < 10; i++)
        {
            script = "$('#divStatus').append('" + "<h1>hello World" + i.ToString() + "!</h1>');";
        }
        return JavaScript(script);
    }

显然在执行之后,字符串“hello World9!” 被添加到 divStatus 控件,因为它是最后执行的,因此当使用 JavaScript(脚本)返回时,它会将最后执行的命令打印到视图中。但是如果我想打印在每个循环中产生的字符串会发生什么?例如,它想要获得以下内容:

你好世界0!

你好世界1!

你好世界2!

你好世界3!

你好世界4!

你好世界5!

你好世界6!

你好世界7!

你好世界8!

你好,World9!

我花了很多天试图做到这一点,这是一场噩梦,谁能告诉我如何摆脱这种情况?我非常感谢。我试图以某种方式做类似于 return 的事情,但我不知道如何告诉视图:“嘿!你必须更新 div 控件并附加新信息!”

我也尝试使用信号器框架来做到这一点,我已经部分阅读了它的教程,但我不明白,我认为没有一个非常简单和小例子来展示如何更新控件,例如在我的例子中,一个 div,来自控制器。另外,如果信号器专家可以为我提供一个在信号器中完成的非常简单的示例,我也非常感谢。

我正在使用 asp.net mvc 4 剃须刀

这是我的真实案例:

控制器:

    public bool DoPing(string hostNameOrAddress)
    {
        bool connectionOk = false;

        try
        {
            System.Net.NetworkInformation.Ping pinger = new System.Net.NetworkInformation.Ping();

            connectionOk = pinger.Send(hostNameOrAddress).Status == System.Net.NetworkInformation.IPStatus.Success;
        }
        catch (Exception ex)
        {
            connectionOk = false;
        }

        return connectionOk;
    }


    [HttpPost]
    public ActionResult PerformWTGTests(TestsModel model)
    {
        bool result = false;            

        using (ConfigContext context = new ConfigContext())
        {
            List<Machine> mCollection = context.Machines.Where(m => m.TypeId == 1).ToList();
            foreach (Machine machine in mCollection)
            {
                result = this.DoPing(machine.IP);

                string res =  result ? "PASSED" : "FAILED";
                Debug.WriteLine(String.Format("IP: {0} - Result: {1}", machine.IP, res, CultureInfo.InvariantCulture));

                // After I obtain the result for each machine I want to update the control in view, in my case a div, saying if it is passed or failed, so I need to do this at each loop for each machine.
                // Below I have tried to update control in view using it but no works
                ViewBag.JS = "updateProgressWindow('" + machine.IP + "','" + res + "');";
            }
        }

        if (result)
        {
            return new HttpStatusCodeResult(HttpStatusCode.OK);
        }
        else
        {
            return new HttpStatusCodeResult(HttpStatusCode.NotFound);
        }
    }
4

1 回答 1

4

你不能。您的操作方法中的 C# 代码将始终在执行客户端脚本之前执行。您最好的选择是简单地在脚本中注入循环:

[HttpPost]
public ActionResult PerformDiagnostic(TestsModel model)
{
    var script = "for (var i = 0; i < 10; i++ ) $('#divStatus').append('<h1>hello World' + i + '</h1>');";
    return JavaScript(script);
}
于 2013-09-21T08:22:37.630 回答