2010-12-09 19 views
1

J'utilise viewModels pour communiquer entre mon contrôleur et ma vue. Pour obtenir la validation des modèles, j'utiliser une classe partielle comme ceci:La validation du modèle avec viewModel ne fonctionne pas

[MetadataType(typeof(EvaluationValidation))] 
public partial class Evaluation 
{ 
    public class EvaluationValidation 
    { 
     [DisplayName("Title of evaluation")] 
     [Required(ErrorMessage="Please give a title")] 
     public string Title { get; set; } 
    } 
} 

DisplayName est binded pour voir sans problème, mais lorsque je tente de présenter le point de vue, je reçois cette erreur:

l'élément de modèle passé dans le dictionnaire est de type « FOOBAR.Models.Evaluation », mais ce dictionnaire a besoin d'un modèle de type élément « FOOBAR.Areas.Evaluation.ViewModels.EvaluationFormViewModel ».

Voici le code utilisé dans mon contrôleur

[HttpPost] 
    public ActionResult Create(FormCollection formValues) 
    { 
     Models.Evaluation data = new Models.Evaluation(); 
     if (TryUpdateModel(data, "evaluations")) 
     { 
      this.daoe.Create(data); 
      return RedirectToAction("Index"); 
     } 
     return View(data); 
    } 

Et ceci est mon viewmodel

public class EvaluationFormViewModel 
{ 
    public FOOBAR.Models.Evaluation evaluations; 
    public SelectList selectlist_evaluationtypes { get; set; } 
    public SelectList selectlist_evaluationstatus { get; set; } 
} 

Avez-vous une idée? Merci d'avance

+0

Je suis nouveau sur ASP.NET MVC mais d'après ce que je peux voir vous passez l'objet d'évaluation plutôt que le ViewModel dans votre vue auquel il ne s'attend pas (vue fortement typée?) –

Répondre

1

Vous passez une instance Models.Evaluation à votre vue, qui est liée à un modèle d'un autre type.

Models.Evaluation data = new Models.Evaluation(); 
if (TryUpdateModel(data, "evaluations")) 
{ 
    // ... 
} 
return View(data); 

Si TryUpdateModel retours false (ce qui se produit lorsque la forme ne passe pas la validation, par exemple), vous passez efficacement data à la vue, qui est de type Models.Evaluation.

Essayez de le mapper pour taper FOOBAR.Areas.Evaluation.ViewModels.EvaluationFormViewModel avant de le passer à la vue.

+0

Hm, en fait, j'étais juste essayer de passer un objet métier où j'ai besoin d'un viewmodel ... Parfois, il vaut mieux tout arrêter et attendre une nouvelle vue ^^ – eka808