3 votes

Knockout MVC - L'appel ServerAction ne s'exécute pas

J'essaie de créer un site Web hébergé sur Azure en tant que site gratuit. Il utilise MVC4, avec KnockoutMVC. Le site Web met à jour un tableau toutes les 4 secondes à partir du contrôleur. Le code s'exécute sans problème localement, mais lorsque je le déploie sur le site Web Azure, il ne traite pas les mises à jour.

J'ai maintenant commencé un tout nouveau projet MVC 4, avec quelques fonctions simples utilisant knockout, affichant l'heure actuelle, et la mettant à jour tous les 0,5 seconde à partir du contrôleur, il utilise la même structure que le javascript que j'ai écrit pour le site web approprié. Le problème est le même, et il semble que l'appel à ko.ServerAction arrête la fonction javascript.

Voir

@using PerpetuumSoft.Knockout
@model MVCHelloWorld.Models.HelloWorldModel
@{
  var ko = Html.CreateKnockoutContext();
 }
<script type="text/javascript">
 function startTime() {
    var today = new Date();
    var h = today.getHours();
    var m = today.getMinutes();
    var s = today.getSeconds();
    // add a zero in front of numbers<10
    m = checkTime(m);
    s = checkTime(s);
    document.getElementById('time').innerHTML = h + ":" + m + ":" + s;

    @ko.ServerAction("Index", "HelloWorld");

    t = setTimeout(function() { startTime(); }, 500);
}

function checkTime(i) {
    if (i < 10) {
        i = "0" + i;
    }
    return i;
}  
</script>

<body onload="startTime()">
   <h2>Hello World - 2</h2>
   <div id="time"></div>

   <label>Knockout time</label>
   @ko.Html.Span(m => m.Time)
</body>

@ko.Apply(Model)

Contrôleur

namespace MVCHelloWorld.Controllers
{
  public class HelloWorldController : BaseController
  {

    public HelloWorldModel model = new HelloWorldModel();

    public ActionResult Index()
    {
        GetTimeDoCalculation();

        return View();
    }

    public void GetTimeDoCalculation()
    {
        model.Time = DateTime.Now.ToString("H:mm:ss");
    }
 }
}

Modèle

namespace MVCHelloWorld.Models
{
public class HelloWorldModel
  {
     public string Time { get; set; }
  }
}

1voto

Anon Points 26

Essayez d'ajouter ceci au corps de votre vue :

<script type="text/javascript">
    @* Replace 4000 with the timeout, in milliseconds *@
    window.setInterval(startTime, 4000)
</script>

Votre vue entière ressemblera à ceci :

@using PerpetuumSoft.Knockout
@model MvcApplication2.Models.HelloWorldModel
@{
    var ko = Html.CreateKnockoutContext();
 }
<script type="text/javascript">
    function startTime() {
        var today = new Date();
        var h = today.getHours();
        var m = today.getMinutes();
        var s = today.getSeconds();
        // add a zero in front of numbers<10
        m = checkTime(m);
        s = checkTime(s);
        document.getElementById('time').innerHTML = h + ":" + m + ":" + s;

        @ko.ServerAction("Index", "HelloWorld");

        t = setTimeout(function() { startTime(); }, 500);
    }

    function checkTime(i) {
        if (i < 10) {
            i = "0" + i;
        }
        return i;
    }  
</script>

<body onload="startTime()">
   <h2>Hello World - 2</h2>
   <div id="time">

       <script type="text/javascript">
           @* Replace 4000 with the timeout, in milliseconds *@
           window.setInterval(startTime, 4000)
       </script>

       <label>Knockout time</label>
   @ko.Html.Span(m => m.Time)

   </div>
</body>

@ko.Apply(Model)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X