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)
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. –
Réponse mise à jour ... –
Merci Dave. Je vais devoir attendre jusqu'à mercredi pour jeter un coup d'œil car je suis en congé pour un peu. Noté, cependant. –