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