-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(script) で戻ると、最後に実行されたコマンドがビューに出力されます。しかし、各ループで発生した文字列を出力したい場合はどうなりますか? たとえば、次のものを取得します。

こんにちはWorld0!

こんにちはWorld1!

こんにちはWorld2!

こんにちはWorld3!

こんにちはWorld4!

こんにちはWorld5!

こんにちはWorld6!

こんにちはWorld7!

こんにちはWorld8!

こんにちは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 に答える