Question

Je suis à la recherche d'idées de validation côté client ASP.Net MVC, y compris xVal. Cela ne fournit pas ValidationSummary au moment donc je choisi de faire un poste AJAX qui fait une boucle par des erreurs de ModelState et mettre à jour un DIV avec les messages d'erreur sur un poste AJAX avec succès.

Le problème est votre ValidationMessage * à côté des champs ne seront pas peuplés. Je suis venu avec une autre idée que je ne l'ai pas encore testé car je ne connais pas la syntaxe complète pour le faire fonctionner encore, mais je pensais voir ce que vous avez pensé.

Une question que je pense peut-être un problème est que lorsque vous publiez sur votre Modifier / Créer méthode d'action dans le contrôleur et vous voulez retourner un objet JSON, je ne suis pas sûr que JSON est est légal utilisé pour les actions GET seulement.

Si vous pensez que une bonne idée et sont désireux d'aider s'il vous plaît laisser une réponse et des extraits de code pour obtenir ce travail. Si vous pensez que son un système brained de cheveux et peut être mieux fait s'il vous plaît laissez-moi savoir comment.

Contrôleur:

if (!ModelState.IsValid)
{
            var err = ModelState.Where(f => f.Value.Errors.Count > 0);    
            if (Request.IsAjaxRequest())
            {
                   return this.Json(err);
            }
            else
            {
                  return View(PostedItem); 
            }
}

Voir:

    $(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" />
Était-ce utile?

La solution

Dans mon projet actuel ASP.NET MVC J'ai beaucoup d'actions POST que j'utilise pour AJAX et avons couru à travers la question de la validation aussi. Ce que je faisais était de créer un objet wrapper qui est renvoyée de chacune de ces actions qui ressemble à quelque chose comme ça ...

public class JsonWrapper
{
   public object Data { get; set; }
   public bool IsError { get; set; }
   public string Message { get; set; }
}

Si la validation dans l'action n'a pas genre d'erreurs, je place toutes les données que je veux retourner dans la propriété des données. Cependant, s'il y a une sorte d'erreur de validation ou d'une autre exception, je mets le drapeau IsError à true et définissez un message d'erreur dans la propriété du message. Puis à la fin de l'action, je sérialiser l'objet JSON et le retourner, (oui, vous pouvez le faire à partir d'une action POST) ...

return Json(myJsonWrapper);

Du côté client, dans le onSuccess de mon code AJAX POST, je vérifie les erreurs et prendre toutes les mesures neccessary comme ça ... (Note, à ce point dans le code, l'objet qui a obtenu renvoyé par le serveur a déjà été désérialisé dans un objet JS par jQuery)

function onSuccess(jsonWrapper) {
    if (!jsonWrapper.IsError) {
        var myDataFromAction = jsonWrapper.Data;
        //Do stuff with my data
    }
    else {
        MessageBox.ShowMessage(jsonWrapper.Message);
    }
}

Ce ne rentre pas dans votre scénario hors de la boîte, mais vous pouvez faire quelque chose de similaire en tant que concept. Espérons que cela vous donne au moins quelques idées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top