2010-05-27 9 views
1

J'essaie de faire une validation dans asp .net MVC 2.0 pour mon application. Je veux avoir une bonne validation côté client. La validation doit être effectuée la plupart du temps du côté du modèle avec DataAnnotations avec des attributs personnalisés (tels que CompareTo, StringLenght, MinPasswordLenght (à partir de la valeur Membership.MinimumumpassworkdLenght) Pour cela, j'ai essayé d'utiliser xval avec jquery.validation des formes travailleront avec ajax et la plupart des problèmes sont quand je veux valider le formulaire avec ajax.asp .net MVC 2.0 Validation

Voici le lien pour exemple de projet http://www.sendspace.com/file/m9gl54.

je suis arrivé deux formes que les contrôles ValidFormControl1.ascx, ValidFormControl2.ascx

<% using (Ajax.BeginForm("CreateValidForm", "Test", new AjaxOptions { HttpMethod = "Post" })) {%> <div id="validationSummary1"> 
    <%= Html.ValidationSummary(true)%> </div> <fieldset> 
    <legend>Fields</legend> 
    <div class="editor-label"> 
     <%= Html.LabelFor(model => model.Name)%> 
    </div> 
    <div class="editor-field"> 
     <%= Html.TextBoxFor(model => model.Name)%> 
     <%= Html.ValidationMessageFor(model => model.Name)%> 
    </div> 
    <div class="editor-label"> 
     <%= Html.LabelFor(model => model.Email)%> 
    </div> 
    <div class="editor-field"> 
     <%= Html.TextBoxFor(model => model.Email)%> 
     <%= Html.ValidationMessageFor(model => model.Email)%> 
    </div> 
    <div class="editor-label"> 
     <%= Html.LabelFor(model => model.Password)%> 
    </div> 
    <div class="editor-field"> 
     <%= Html.TextBoxFor(model => model.Password)%> 
     <%= Html.ValidationMessageFor(model => model.Password)%> 
    </div> 
    <div class="editor-label"> 
     <%= Html.LabelFor(model => model.ConfirmPassword)%> 
    </div> 
    <div class="editor-field"> 
     <%= Html.TextBoxFor(model => model.ConfirmPassword)%> 
     <%= Html.ValidationMessageFor(model => model.ConfirmPassword)%> 
    </div> 
    <p> 
     <input type="submit" value="Create" /> 
    </p> </fieldset> <% } %> <%= Html.ClientSideValidation<ValidModel>() 
    .UseValidationSummary("validationSummary1", "Please fix the following problems:") %> 

Les deux semblent identiques, la seule différence réside dans la validation summaryID (validationSummary1, validationSummary2). Les deux contrôles sont rendus sur une page:

Form2 
    <%Html.RenderPartial("~/Views/Test/ValidFormControl2.ascx", null); %> 
Form1 

<%Html.RenderPartial("~/Views/Test/ValidFormControl.ascx", null); %> 

propriété Validation

problème Tout d'abord, quand nous avons deux contrôles avec le même type de valider ne fonctionne pas becosue éléments HTML sont rendus par nom de domaine (donc nous avons deux éléments avec le même nom "Mot de passe"). Seul le premier formulaire sera validé par le client. La pire chose est que même si nous avons des types différents et que leur nom de champs est identique, la validation ne fonctionnera pas trop (cette chose est ce dont j'ai besoin pour réparer ce sera stupide de nommer quelques propriétés uniques pour la validation).

Y at-il une solution pour cela?

attributs personnalisés validation

personnalisé La prochaine chose que les attributs de validation (Toutes les erreurs sont quand je l'utilise Ajax pour la validation de la forme normale fonctionne sans problème.):

CompareTo - Simple comparer à cela est fait dans le modèle mvc pour le modèle de compte (attribut de classe disant avec deux propriétés sera comparé), et il n'a pas été montré sur la page. Pour ce faire, j'ai créé mon propre CachingRulesProvider avec compareRule et mon attribut. Peut-être qu'il y a un moyen plus facile de le faire?

StringLenght avec la valeur minimum et maximum, je ne décrirai pas comment je l'ai fait mais y a-t-il n'importe quel lactosérum facile de le faire?

Résumé de validation

Quand j'ai deux deux commandes de la page toutes les informations de validation sommaire va au premier élément de synthèse de validation de commande, même script généré xval dire que elementID sont différents pour le résumé. Quelqu'un sait comment le réparer?

information Validation

Y at-il possibilité d'activer des messages sur le lieu où est Html.ValidationMessageFor (modèle => model.ConfirmPassword). Becsoue pour moi ça ne se montre pas. Je voudrais avoir des informations de résumé et de champ proche, pas seulement une bordure rouge. Quelqu'un sait comment le faire?

Ajax soumettre

Quelqu'un sait comment faire facilement sans le code javascript massive pour ne soumettre via javascript. Ceci sera utilisé pour changer l'entrée soumise à l'élément href (a). Les deux semblent identiques la seule différence est que le résumé de validation

+3

Il y a beaucoup de questions valables ici. Le SO est plus adapté pour des questions simples. Il pourrait être utile de briser ces questions et de les poster à nouveau pour obtenir des réponses. –

Répondre

0

Tout d'abord, je ne sais pas pourquoi vous voulez avoir deux contrôles, ayant deux champs identiques, une forme. Chaque formulaire doit avoir son propre modèle et utiliser un modèle comme validateur.

Sample.Models d'espace de noms { [métatype (typeof (PersonaValidation))] Personne de classe partielle publique { } public class PersonValidation { [Obligatoire (ErrorMessage = "Prénom requis")] [ StringLength (20, ErrorMessage = "Le prénom doit comporter 20 caractères ou moins")] [DisplayName ("First Name")] public string Prénom {get; ensemble; }

[Required(ErrorMessage = "Last name Required")] 
    [StringLength(20, ErrorMessage = "Last name must be 20 or less characters in length")] 
    [DisplayName("Last Name")] 
    public string Lastname { get; set; } 

}}

Dans votre ASPX, ajoutez les fichiers de script suivants avant balise form:

<h2>Validation Sample</h2> 

<script src="/Scripts/MicrosoftAjax.js" type="text/javascript"></script> 
<script src="/Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script> 
<script src="/Scripts/MicrosoftMvcValidation.js" type="text/javascript"></script> 
<% Html.EnableClientValidation(); %> 

<% using (Html.BeginForm()) {%> 
    <%= Html.ValidationSummary(true) %> 
     <fieldset> 

     <div class="editor-label"> 
      <%= Html.LabelFor(model => model.Firstname) %> 
     </div> 
     <div class="editor-field"> 
      <%= Html.TextBoxFor(model => model.Firstname) %> 
      <%= Html.ValidationMessageFor(model => model.Firstname) %> 
     </div> 

     <div class="editor-label"> 
      <%= Html.LabelFor(model => model.Lastname) %> 
     </div> 
     <div class="editor-field"> 
      <%= Html.TextBoxFor(model => model.Lastname) %> 
      <%= Html.ValidationMessageFor(model => model.Lastname) %> 
     </div> 

     <p> 
      <input type="submit" value="Save" /> 
     </p> 
    </fieldset> 

<% } %> 

Cela fonctionne à chaque fois. Le message d'erreur s'affichera à côté du champ non valide.

0

En ce qui concerne l'ajax submit, vous pouvez simplement mettre un bouton sur votre formulaire puis cliquer sur celui-ci via jQuery. Cela mènerait aussi à la publication de votre formulaire.

Vous pouvez également faire un appel ajax à l'action du contrôleur (sur un clic de lien) et ici vous publiez les données nécessaires à partir de votre formulaire.