2013-09-21 3 views
-2

У меня есть элемент div в моем представлении, называемый «divStatus», который я хочу обновить от контроллера. Я хочу, чтобы я добавлял информацию в существующий контент в div, поэтому от контроллера я делаю:Ввод javascript для просмотра

 [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); 
    } 

очевидно, после его выполнения, строка «привет World9!» добавляется в элемент управления divStatus, потому что последний выполняется, поэтому при возврате с помощью JavaScript (скрипт) он выводит на экран последнюю выполненную команду. Но что произойдет, если я хочу напечатать строки, созданные в каждом цикле? например, он хочет получить следующее:

hello World0!

привет мир1!

привет мир2!

привет мир3!

привет мир4!

привет мир5!

привет мир6!

привет мир7!

привет мир8!

привет мир9!

Я потратил много дней, пытаясь это сделать, и это кошмар, может ли кто-нибудь сказать мне, как получить эту ситуацию? Я высоко ценю. Я попытался каким-то образом сделать что-то подобное возврату, но я понятия не имею, как сказать мнению: «Эй, вы должны обновить div-контроль с помощью новой информации!»

Также я попытался использовать средство signalr framework для этого, и я частично прочитал его учебник, но я не понимаю, я думаю, что нет простого и небольшого примера, показывающего, как обновить элемент управления, например в моем случае, div, от контроллера. Кроме того, если кто-то специалист в signalr может предоставить мне очень простой пример, сделанный в signalr, я также высоко ценю.

Я использую 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

Вы не можете. Код 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); 
} 
+0

ОК, но ваше решение подходит для этого случая, я имею в виду, чтобы разрешить простой случай, как это, но представьте себе в контроллере. Я делаю более сложные вещи , подобно базе данных запросов с использованием структуры сущностей, и в этом случае будет нецелесообразно делать, как вы говорите. Anway для простых вещей, чтобы делать то, что вы говорите, абсолютно правильно. – user1624552

+0

Без каких-либо подробностей о том, в каких сложных случаях ваш контроллер пытается справиться, я не смогу вам помочь. Рад, что это вам помогло. Пожалуйста, подумайте о принятии моего ответа. – rexcfnghk

+0

См. Мое сообщение обновлено. Как видите, у меня есть коллекция машин. Я хочу проверить, жив ли каждый из них, пинговая к нему и для каждой машины, затем я хочу обновить элемент управления div в представлении, чтобы проинформировать пользователя о ходе и сообщить для каждой машины, если он прошел или провалился при попытке выполните пинг. Как вы можете видеть, это более сложная ситуация, когда использование вашего подхода было бы очень сложным и не подходящим. Я абсолютно уверен, что я не единственный, у кого такая ситуация, которая хочет обновить ui от контроллера. – user1624552

Смежные вопросы