2 votes

Comment puis-je définir la valeur d'une boîte de texte Kendo et passer cette valeur au contrôleur pour que le modèle soit valide ?

Je fixe la valeur d'un Kendo Text Box For en Javascript, j'affiche cette valeur à l'écran, mais j'obtiens une erreur indiquant que le champ est nul et que l'état du modèle est invalide lorsqu'il arrive au contrôleur. Comment puis-je définir la valeur de la zone de texte et conserver cette valeur pour que l'état du modèle soit valide ?

Voici ce que j'ai :

  • Projet ASP.net MVC Visual Studio avec C#
  • Contrôle du planificateur de Kendo/Telerik
  • Pop-up d'événement du planificateur défini dans le modèle (fichier CSHTML séparé)
  • Dans le modèle, un Kendo TextBoxForControl pour le champ Title
  • Également dans le modèle, une liste déroulante Kendo pour le champ TaskSourceWoId

Lorsqu'un utilisateur sélectionne une valeur dans la liste déroulante, Javascript définit la valeur du titre de la manière suivante :

$("#Title").val("WO# " + workOrderID);

Le texte s'affiche à l'écran (voir les captures d'écran ci-dessous). Cependant, lorsque l'utilisateur clique sur le bouton d'enregistrement, il reçoit une erreur indiquant que le titre ne peut pas être vide. Si je regarde dans le contrôleur la méthode qui est activée lorsque l'utilisateur clique sur le bouton de sauvegarde, je peux voir que dans le modèle, Title est effectivement nul et que cela entraîne l'invalidité de l'état du modèle. J'ai ajouté du Javascript pour obtenir la valeur de Title immédiatement après l'avoir défini à l'aide du code ci-dessus et elle est nulle.

J'ai essayé plusieurs façons différentes de définir le titre dans le javascript ; la plupart du temps, il s'agit de quelque chose comme ceci :

alert($("#Title").data("kendoTextBox").value());

et il renvoie une erreur "non trouvé".

Alors comment puis-je définir Title de manière à ce qu'il n'apparaisse pas seulement à l'écran, mais qu'il soit reconnu par le contrôleur et que l'état du modèle ne soit pas invalide ?

Voici la fenêtre pop-up de l'événement lorsqu'elle s'ouvre pour la première fois. Notez que le titre est vide à ce stade : enter image description here

Après la sélection d'un bon de travail dans une liste déroulante, le titre est configuré pour inclure cette valeur et le titre a maintenant une valeur sur l'écran :

$("#Titre").val("WO# " + workOrderID) ; enter image description here

Cependant, lorsque l'utilisateur clique sur Enregistrer et que le code passe au contrôleur, l'état du modèle n'est pas valide et la valeur de Title est nulle :

enter image description here

enter image description here

C'est le code pour le programmateur :

@(Html.Kendo().Scheduler<SchedTasksModel>()
                      .Name("scheduler")
                      .Date(DateTime.Today)
                      .StartTime(DateTime.Parse(string.Format("{0} {1}", DateTime.Today.ToShortDateString(), "07:00")))
                      .Height(600)
                      .Views(views =>
                      {
                          views.DayView();
                          views.WeekView(weekView => weekView.Selected(true));
                          views.MonthView();
                          views.AgendaView();
                      })
                      .Editable(editable => editable.TemplateName("KoorsenEditor"))
                      .Timezone("Etc/UTC")
                      .Events(e => { e.Edit("sched_edit"); })
                      .Resources(resource =>
                      {
                          resource.Add(m => m.TaskType)
                              .Title("Type")
                              .DataTextField("Text")
                              .DataValueField("Value")
                              .DataColorField("Color")
                              .BindTo(new[]
                              {
                                  new {Text = "Work Order", Value = 1, Color = "#6eb3fa"},
                                  new {Text = "Event", Value = 2, Color = "#f58a8a"}
                              });

                          resource.Add(m => m.TaskSourceId)
                              .Title("Wo")
                              .DataTextField("Name")
                              .DataValueField("Id")
                              .DataSource(ds => ds.Read(read => read.Action("GetSchedWo", "Sched", new { userID = ViewBag.CurrUser, userType = ViewBag.CurrUsrType })));

                          resource.Add(m => m.TaskSourceEvtId)
                              .Title("Evt")
                              .DataTextField("Name")
                              .DataValueField("Id")
                              .BindTo(new[]
                              {
                                  new {Name = "Meeting", Id = 1},
                                  new {Name = "Vacation", Id = 2},
                                  new {Name = "Sick Time", Id = 3},
                                  new {Name = "Other", Id = 4}
                              });
                          resource.Add(m => m.TaskResId)
                              .Title("Res")
                              .DataTextField("Name")
                              .DataValueField("Id")
                              .DataSource(ds => ds.Read(read => read.Action("GetTechRes", "Sched")));
                      })
                      .DataSource(d => d.Model(m =>
                      {
                          m.Id(f => f.TaskId);
                          m.Field(f => f.Title).DefaultValue("");
                          m.Field(f => f.TaskType).DefaultValue(1);
                          m.RecurrenceId(f => f.RecurrenceId);
                      })
                          .Events(e =>
                          {
                              e.Error("error_handler");
                              e.Sync("onSchedulerSync");
                          })
                          .Create("WrkOrdTasksCreate", "Sched")
                          .Read("WrkOrdTasksRead", "Sched")
                          .Update("WrkOrdTasksUpdate", "Sched")
                          .Destroy("WrkOrdTasksDestroy", "Sched")
                          .Filter(filters => filters.Add(model => model.TaskResId).IsNotEqualTo(0))
                      )
                      )

Editor.cshtml définissant la zone de texte

 @(Html.TextBoxFor(model => model.Title, new {@class = "k-textbox", data_bind = "value:title"}))

Javascript définissant la valeur du champ titre

    function onWorkOrderChange(e) {
    try {
        var workOrderID = $("#TaskSourceWoId").data("kendoDropDownList").value();
        if ($("#Title").val() == "") {
            $("#Title").val("WO# " + workOrderID);
        }
    } catch (ex) {
        alert(ex);
    }
}

5voto

boilers222 Points 761

J'ai eu des nouvelles de Telerik. Leur réponse était :

Afin de notifier au modèle la valeur du titre automatiquement attribuée, vous devez déclencher l'événement de modification du champ Titre.

Pour la zone de texte, j'ai simplement ajouté change() à la fin de l'affectation :

$("#Title").val("WO# " + workOrderID).change();

Cela n'a pas fonctionné pour la liste déroulante. J'ai finalement trouvé la syntaxe sur une autre page StackOverflow : aquí

Donc dans mon cas, le code qui a fonctionné pour la liste déroulante était :

$("#TaskResId").data("kendoDropDownList").value('@ViewBag.CurrUser');
$("#TaskResId").data("kendoDropDownList").trigger("change");

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