2010-03-22 5 views
2

J'ai une classe .NET 2.0 dont les propriétés sont marqués virtual.I besoin d'utiliser la classe comme un modèle dans une application MVC2. J'ai donc créé une classe .NET 3.5 héritant de la classe .NET 2.0 et ajouté les attributs DataAnnotations aux propriétés redéfinies dans la nouvelle classe. Un extrait de ce que je l'ai fait est inférieurMVC2 validation des DataAnnotations avec l'héritage

// .NET 2.0 class 
public class Customer 
{ 
    private string _firstName = ""; 
    public virtual string FirstName 
    { 
     get { return _firstName; } 
     set { _firstName = value; } 
    } 
} 

// .NET 3.5 class 
public class MVCCustomer : Customer 
{ 
    [Required(ErrorMessage="Firstname is required")] 
    public override string FirstName 
    { 
     get { return base.FirstName; } 
     set { base.FirstName = value; } 
    } 
} 

J'ai utilisé la classe comme modèle pour une vue MVC2 en utilisant les aides htmlFor. La validation Serverside fonctionne correctement mais pas la validation côté client. Plus précisément, l'erreur de validation n'est pas affichée sur la page.

Qu'est-ce que je manque, ou est-il possible de le faire en utilisant les classes de copain.

Merci.

EDIT 1: J'ai maintenant essayé avec des classes de validation de jumelage et cela ne fonctionne pas non plus.

EDIT 2: J'ai maintenant découvert que l'expression lambda fournie aux assistants HtmlFor est à l'origine du problème. Par exemple Html.TextBoxFor (m => m.Prénom) appelle la méthode ModelMetadata.FromLambdaExpression qui évalue le DeclaringType de MemberExpression (expression.Body) en tant que classe Customer et non en tant que classe MVCCustomer.

J'ai essayé de changer l'expression lambda en Html.TextBoxFor ((MVCCustomer m) => m.FirstName) mais le DeclaringType est toujours Client.

Y at-il une manière que je peux obtenir le DeclaringType être de type MVCCustomer et non client.

+0

Avez-vous appelé EnableClientValidation? – SLaks

+0

Oui, EnableClientValidation est appelée à partir de la page aspx. – bhiku

Répondre

2

J'ai maintenant eu le temps de cela en utilisant le nouveau mot clé sur les propriétés de la classe .net 3.5 comme ci-dessous

// .NET 2.0 class 
public class Customer { 
    private string _firstName = ""; 
    public string FirstName 
    { 
    get { return _firstName; } 
    set { _firstName = value; } 
    } 
} 

// .NET 3.5 class 
public class MVCCustomer : Customer { 
    [Required(ErrorMessage="Firstname is required")] 
    public new string FirstName 
    { 
     get { return base.FirstName; } 
     set { base.FirstName = value; } 
    } 
} 

Cela fonctionne maintenant comme prévu et les DataAnnotations attributs de la classe MVCCustimer sont appliqués correctement.

Espérons que cela aide

0

question stupide, mais avez-vous inclus les scripts suivants dans votre vue/fichier maître?

<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> 

Elles sont requises pour la validation côté client.

+0

Oui, j'ai ajouté les scripts à la page maître. Pour contourner ce problème, j'ai créé des classes .NET 3.5 qui reflètent les classes .NET 2, appliqué la classe DataAnnotations à .NET 3.5 et copiez les propriétés dans les classes .NET 2 à l'aide de la réflexion. Pas idéal, mais ça marche. Je suis juste surpris que je m'attendais à ce que cela fonctionne hors de la boîte. – bhiku

Questions connexes