0

Plusieurs didacticiels expliquent comment utiliser l'annotation de données EF pour la validation de formulaires à l'aide du framework MVC. Et d'utiliser jquery pour le côté client.Entity Framework - Validation (serveur + client, jquery) avec des annotations de données, SANS MVC?

Voir http://dotnetaddict.dotnetdevelopersjournal.com/clientvalidation_mvc2.htm .: par exemple

Je voudrais obtenir le même, mais sans utiliser MVC/MVC2.

Je veux construire un site classique asp.net, créer le modèle d'entités, créer mes classes partielles qui incluent la validation (obligatoire, regex, etc.).

J'ai créé le modèle d'entités et les classes partielles incluant les annotations de données. Je peux ajouter de nouveaux enregistrements à la base de données.

Ce qui me manque, c'est la validation. Maintenant, je peux ajouter des enregistrements à la base de données même si les champs ne sont pas valides, je voudrais obtenir les erreurs, et si possible je voudrais utiliser jquery pour la validation du client (dans MVC vous ajoutez <% Html.EnableClientValidation(); %> à la vue ...).

Pouvez-vous m'aider? Ou me diriger vers de bonnes ressources en ligne qui expliquent cela?

Merci beaucoup.

EDIT: J'ai trouvé quelque chose ici:

How can I tell the Data Annotations validator to also validate complex child properties?

J'ai une entité appelée "User" et je créé une classe partielle comme suit:

using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 

namespace MySite.Models 
{ 
    [MetadataType(typeof(UserMetaData))] 
    public partial class User 
    { 
    } 

    public class UserMetaData 
    { 
     [Required(ErrorMessage = "Username Required")] 
     [DisplayName("Username")] 
     public string Username{ get; set; } 

     [DisplayName("Password")] 
     [Required(ErrorMessage = "Password Required")] 
     [RegularExpression(@"^[^;>;&;<;%?*!~'`;:,."";+=|]{6,10}$", ErrorMessage = "The password must be between 6-10 characters and contain 2 digits")] 
     public string Password{ get; set; } 
    } 
} 

Dans le code derrière de ma page j'ai mis un contrôle similaire "isValid" comme dans le lien mentionné ci-dessus:

var validationContext = new ValidationContext(person, null, null); 
var validationResults = new List<ValidationResult>(); 

var isValid = Validator.TryValidateObject(userToAdd, validationContext, validationResults); 

if (isValid) 
{ 
savetoDB(); 
} 

Mais quand je débogue ... "isValid" est toujours "vrai", même si je laisse les champs NULL. Aide: -S

EDIT2:

Il était toujours "vrai" parce que je remplissais les propriétés "utilisateur", comme suit:

User userToAdd = new User(); 
userToAdd.Username = txtUsername.Text; 
userToAdd.Password = txtPassword.Text; 

j'ai changé l'objet: de "Utilisateur" à "UserMetaData" (User userToAdd = new UserMetaData();) alors la validation fonctionne ("false" si l'expression régulière n'est pas respectée) ... mais quand même, assez bizarre ... alors je devrais créer un autre objet "User" et le remplir à nouveau ... non très propre ...

Répondre

0

Vous avez probablement trouvé une solution ou vous avez changé, mais je J'ai piloté un projet open source qui fait exactement cela: la validation de style MVC avec les attributs Data Annotations et jQuery Validate.

http://xvalwebforms.codeplex.com

Vous serez intéressé par la branche jQuery.Validate. Ce n'est pas encore complet, mais très proche.Voici un exemple du projet de démonstration:

Modèle

public class Booking : IValidatableObject 
{ 
    [Required(ErrorMessage = "Client name is required.")] 
    [StringLength(15, ErrorMessage = "Client name must be less than 15 characters.")] 
    public string ClientName { get; set; } 

    [Range(1, 20, ErrorMessage = "Number of guests must be between 1 and 20.")] 
    public int NumberOfGuests { get; set; } 

    [Required(ErrorMessage = "Arrival date is required.")] 
    [DataType(DataType.Date, ErrorMessage = "Arrival date is invalid.")] 
    public DateTime ArrivalDate { get; set; } 

    [Required(ErrorMessage = "Smoking type is requried.")] 
    public SmokingType SmokingType { get; set; } 

    [Required(ErrorMessage = "Email address is required.")] 
    [DataType(DataType.EmailAddress, ErrorMessage = "Email address is invalid.")] 
    public string EmailAddress { get; set; } 

    #region IValidatableObject Members 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (ArrivalDate == DateTime.MinValue) 
     { 
      yield return new ValidationResult("Arrival date is required.", new[] {"ArrivalDate"}); 
     } 

     // Business rule: Can't place bookings on Sundays 
     if (ArrivalDate.DayOfWeek == DayOfWeek.Sunday) 
     { 
      yield return new ValidationResult("Bookings are not permitted on Sundays.", new[] {"ArrivalDate"}); 
     } 
    } 

    #endregion 
} 

ASPX Markup

<fieldset class="booking"> 
     <legend>Booking</legend> 
     <asp:ValidationSummary ID="valSummary" runat="server" CssClass="ui-state-error" /> 
     <val:ModelValidator ID="valBooking" runat="server" CssClass="validator" Display="Dynamic" 
      ModelType="xVal.WebForms.Demo.Booking" /> 
     <label for="txtClientName"> 
      Your name:</label> 
     <asp:TextBox ID="txtClientName" runat="server" /> 
     <val:ModelPropertyValidator ID="valClientName" runat="server" CssClass="validator" 
      ControlToValidate="txtClientName" Display="Dynamic" PropertyName="ClientName" 
      ModelType="xVal.WebForms.Demo.Booking" /> 
     <label for="txtNumberOfGuests"> 
      Number of guests:</label> 
     <asp:TextBox ID="txtNumberOfGuests" runat="server" /> 
     <val:ModelPropertyValidator ID="valNumberOfGuests" runat="server" CssClass="validator" 
      ControlToValidate="txtNumberOfGuests" Display="Dynamic" PropertyName="NumberOfGuests" 
      ModelType="xVal.WebForms.Demo.Booking" /> 
     <label for="txtArrivalDate"> 
      Arrival date:</label> 
     <asp:TextBox ID="txtArrivalDate" runat="server" CssClass="date-picker" /> 
     <val:ModelPropertyValidator ID="valArrivalDate" runat="server" CssClass="validator" 
      ControlToValidate="txtArrivalDate" Display="Dynamic" PropertyName="ArrivalDate" 
      ModelType="xVal.WebForms.Demo.Booking" /> 
     <label for="txtEmailAddress"> 
      Email address:</label> 
     <asp:TextBox ID="txtEmailAddress" runat="server" /> 
     <val:ModelPropertyValidator ID="valEmailAddress" runat="server" CssClass="validator" 
      ControlToValidate="txtEmailAddress" Display="Dynamic" PropertyName="EmailAddress" 
      ModelType="xVal.WebForms.Demo.Booking" /> 
     <div> 
      <asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClick="btnSubmit_Click" /></div> 
    </fieldset> 

code derrière

protected void btnSubmit_Click(object sender, EventArgs e) 
{ 
    if (!IsValid) 
    { 
     return; 
    } 

    if (txtNumberOfGuests.Text.Length == 0) 
    { 
     txtNumberOfGuests.Text = "1"; 
    } 

    Booking booking = new Booking 
          { 
           ClientName = txtClientName.Text, 
           NumberOfGuests = Convert.ToInt32(txtNumberOfGuests.Text), 
           ArrivalDate = Convert.ToDateTime(txtArrivalDate.Text), 
           EmailAddress = txtEmailAddress.Text 
          }; 

    BookingManager.PlaceBooking(booking); 
}