J'ai examiné de nombreuses idées de validation côté client ASP.Net MVC, y compris xVal. Cela ne fournit pas un ValidationSummary pour le moment, j'ai donc choisi de faire un post AJAX qui boucle les erreurs ModelState et met à jour un DIV avec les messages d'erreur sur un post AJAX réussi.Idée de validation AJAX - Complète avec ValidationSummary & ValidationMessage
Le problème avec ceci est votre ValidationMessage * à côté des champs ne seront pas remplis. Je suis venu avec une idée alternative que je n'ai pas encore testée car je ne connais pas la syntaxe complète pour la faire fonctionner mais j'ai pensé que je verrais ce que vous pensiez. Un problème que je pense peut-être un problème est que lorsque vous postez sur votre méthode Modifier/Action dans le contrôleur et que vous voulez retourner un objet JSON, je ne suis pas sûr que ce soit légal car JSON est utilisé pour GET actions seulement.
Si vous pensez que c'est une bonne idée et que vous voulez aider, veuillez laisser une réponse et des extraits de code pour que cela fonctionne. Si vous pensez que c'est un schéma de cerveau de cheveux et peut être fait mieux s'il vous plaît laissez-moi savoir comment.
Controller:
if (!ModelState.IsValid)
{
var err = ModelState.Where(f => f.Value.Errors.Count > 0);
if (Request.IsAjaxRequest())
{
return this.Json(err);
}
else
{
return View(PostedItem);
}
}
Vue:
$(function() {
$('#createForm').ajaxForm({
success:fillSummary
});
//click events
$('#btnSave').click(function(){
$('#createForm').submit();
});
function fillSummary(data)
{
//Loop through the modelstate errors returned
$.each(data)
{
//Append Summary DIV with error message
//Look for span with the ModelState key name and set it to visible
}
}
<div id="summary">
<%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.")%>
</div>
<form action="<%=Url.Action("Create") %>" method="post" id="createForm">
<fieldset>
<div>
<label for="Title">Title:</label>
<%= Html.TextBox("Title",Model.Title) %>
<%= Html.ValidationMessage("Title", "*") %>
<span id="val_Title" style="display:none">*</span>
</div>
</form>
<input type="button" value="Save" id="btnSave" />
S'il n'y a pas d'erreurs, quel est le MessageBox.ShowMessage - n'est pas Windows Forms? S'il n'y a pas d'erreurs côté serveur, je suppose que vous continuez dans votre action de contrôleur et ajoutez des données à la base de données? Ne renvoyez-vous le JSON qu'en cas d'erreur? On dirait une bonne implémentation cependant! – Jon
J'ai mis en œuvre mon propre contrôle côté client MessageBox afin que je puisse facilement afficher des messages sur la page, désolé pour la confusion. :) Et oui, s'il n'y a pas d'erreurs, l'action du contrôleur fera juste ce qu'il est censé faire, et je renverrai toute information intéressante au client dans la propriété Data, peut-être un ID d'enregistrement pour un insert db par exemple. Je passe toujours un objet JSON JsonWrapper au client lorsque le client attend une réponse à une action AJAX POST. Cela permet une API commune du côté client. Notez que tout objet peut être renvoyé dans "Data", ce qui permet une grande flexibilité. –
J'ai commencé à l'implémenter mais j'ai des problèmes avec le JSON. Lorsque j'essaie d'ajouter les données à la DIV, cela ne fait rien. J'ai mis une alerte et les données reviennent dans le bon format, donc je ne suis pas sûr. C'est ce que j'ai: fonction showJSON (erreurs) { $ ("# résumé"). Empty(); $ .each (erreurs, fonction (i, erreur) { $ ("# résumé"). Append (erreur.txt); }); } – Jon