2010-04-01 5 views
0

J'essaie d'obtenir la validation pour fonctionner dans ASP.NET MVC 2, mais sans beaucoup de succès.Modèle ASP.NET MVC 2 encapsulé dans la validation ViewModel

J'ai une classe complexe contenant un grand nombre de champs. (Ne posez pas la question - ceci est l'un de ces situations réelles que les meilleures pratiques ne peuvent pas toucher) Ce serait normalement mon modèle et est une classe générée par LINQ-to-SQL.

Parce que ce code est généré, j'ai créé une classe MetaData selon http://davidhayden.com/blog/dave/archive/2009/08/10/AspNetMvc20BuddyClassesMetadataType.aspx.

public class ConsultantRegistrationMetadata 
{ 

    [DisplayName("Title")] 
    [Required(ErrorMessage = "Title is required")] 
    [StringLength(10, ErrorMessage = "Title cannot contain more than 10 characters")]  
    string Title { get; set; } 

    [Required(ErrorMessage = "Forename(s) is required")] 
    [StringLength(128, ErrorMessage = "Forename(s) cannot contain more than 128 characters")] 
    [DisplayName("Forename(s)")] 
    string Forenames { get; set; } 
     // ... 

Je joins ce à la classe partielle de ma classe générée:

[MetadataType(typeof(ConsultantRegistrationMetadata))] 
public partial class ConsultantRegistration 
{ 
    // ... 

Parce que ma forme est complexe, il a un certain nombre de dépendances, comme SelectLists, etc. que j'ai encapsulé dans un modèle ViewModel - et inclus le modèle ConsultantRegistration comme propriété:

public class ConsultantRegistrationFormViewModel 
{ 
    public Data.ConsultantRegistration ConsultantRegistration { get; private set; } 

    public SelectList Titles { get; private set; } 
    public SelectList Countries { get; private set; } 
// ... 

il est donc essentiellement ViewModel => modèle

My View a alors:

<p> 
     <%: Html.LabelFor(model => model.ConsultantRegistration.Title) %> 
     <%: Html.DropDownListFor(model => model.ConsultantRegistration.Title, Model.Titles,"(select a Title)") %> 
     <%: Html.ValidationMessage("Title","*") %> 
    </p> 

    <p> 
     <%: Html.LabelFor(model => model.ConsultantRegistration.Forenames) %> 
     <%: Html.TextBoxFor(model => model.ConsultantRegistration.Forenames) %> 
     <%: Html.ValidationMessageFor(model=>model.ConsultantRegistration.Forenames) %> 
    </p> 

Le problème est, la validation des attributs de la classe de métadonnées sont sans effet. J'ai essayé de le faire via une interface, mais aussi aucun effet. Je commence à penser que la raison est parce que j'encapsule mon modèle dans un ViewModel.

Mon contrôleur (Créer une action) est la suivante:

[HttpPost] 
     public ActionResult Create(Data.ConsultantRegistration consultantRegistration) 
     { 
      if (ModelState.IsValid) // this is always true - which is wrong!! 
      { 
       try 
       { 

        consultantRegistration = ConsultantRegistrationRepository.SaveConsultantRegistration(consultantRegistration); 

        return RedirectToAction("Edit", new { id = consultantRegistration.ID, sectionIndex = 2 }); 
       } 
       catch (Exception ex) 
       { 
        ModelState.AddModelError("CreateException",ex); 
       } 
      } 

      return View(new ConsultantRegistrationFormViewModel(consultantRegistration)); 

     } 

Comme il est indiqué dans le commentaire, la propriété ModelState.IsValid retourne toujours vrai, en dépit des champs avec les annotations Validaiton ne pas être valide. (Les prénoms étant un exemple clé). Est-ce que je manque quelque chose d'évident - étant donné que je suis un débutant MVC? Je suis après le mécanisme démo par Jon Galloway au http://www.asp.net/learn/mvc-videos/video-10082.aspx.

(Am courant t est similaire à ASP.NET MVC Model/ViewModel Validation mais ce poste semble parler xVal. Je ne sais pas ce qui est et pense qu'il est pour MVC 1)

Répondre

1

J'ai essayé de faire ce travail pour parfois. Basé sur le code que vous avez inclus, je pense que vous le faites correctement.

Je pense que le problème est avec les validateurs javascript qui sont censés être "émis" dans la page. Il y a plusieurs autres questions ici sur SO concernant ce problème et je ne pense pas qu'aucun d'entre eux offrent une solution qui fonctionne dans tous les domaines. Pour autant que je sache, MVC2 RC est toujours cassé.

MISE À JOUR:

Si cela fonctionne lorsque vous appliquez les attributs du code émis, jetez un oeil à ceci:

When using Data Annotations with MVC, Pro and Cons of using an interface vs. a MetadataType

Il peut être l'attribut MetadataType qui ne fonctionne pas. Cela fonctionne-t-il si vous essayez une interface comme suggéré dans la question ci-dessus?

En outre, une autre question: MetadataType and client validation in ASP.NET MVC 2

que l'on est assez récent et confirme que cela est encore un bogue dans MVC2.

+0

Ah, super. Cela fonctionne (pas JS, mais la moitié est aussi bonne) si j'applique les attributs directement sur le code généré par LINQ-to-SQL. De toute évidence pas une solution. –

+0

Réponse mise à jour ... –

+0

Merci Dave. Je vais devoir attendre jusqu'à mercredi pour jeter un coup d'œil car je suis en congé pour un peu. Noté, cependant. –

Questions connexes