2010-06-08 3 views
3

J'ai une application MVC2 qui utilise le modèle MVVM. J'essaie d'utiliser les annotations de données pour valider la saisie de formulaire.MVC2 DataAnnotations sur ViewModel - Je ne comprends pas l'utiliser avec le modèle MVVM

Dans mon ThingsController J'ai deux méthodes:

[HttpGet] 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    public ActionResult Details(ThingsViewModel tvm) 
    { 
    if (!ModelState.IsValid) return View(tvm); 

     try 
     { 
Query q = new Query(tvm.Query); 
      ThingRepository repository = new ThingRepository(q); 

tvm.Things = repository.All();     
return View(tvm); 
     } 
     catch (Exception) 
     { 
      return View(); 
     } 
    } 

vue Mon Details.aspx est fortement typée au ThingsViewModel:

<%@ Page Title="" 
     Language="C#" 
     MasterPageFile="~/Views/Shared/Site.Master"   
     Inherits="System.Web.Mvc.ViewPage<Config.Web.Models.ThingsViewModel>" %> 

Le ViewModel est une classe composée d'un IList de chose de retour objets et la chaîne de requête (qui est soumise sur le formulaire) et possède l'annotation de données requises:

public class ThingsViewModel 
{ 
    public IList<Thing> Things{ get; set; } 

    [Required(ErrorMessage="You must enter a query")] 
    public string Query { get; set; } 
} 

Quand je lance cela, et cliquez sur le bouton d'envoi du formulaire sans entrer une valeur que je reçois un YSOD avec l'erreur suivante:

The model item passed into the dictionary is of type 
'Config.Web.Models.ThingsViewModel', but this dictionary 
requires a model item of type 
System.Collections.Generic.IEnumerable`1[Config.Domain.Entities.Thing]'. 

Comment puis-je obtenir des données Annotations de travailler avec un ViewModel? Je ne peux pas voir ce qui me manque ou ce qui ne va pas - la machine virtuelle fonctionnait très bien avant que je ne commence à déblatérer avec la validation.

Répondre

1

Je ne pense pas que le problème soit lié à la validation.

Modifier cette ligne;

tvm.Things = repository.All(); //Is this the Linq extension method 'All()'? 

à cette

tvm.Things = repository.ToList(); 

Je ne sais pas ce que cela est ou ce qu'elle fait;

new ThingRepository(q); 

Il prend un paramètre de chaîne et renvoie une sorte de Linq IQueriable ou List? Si cela retourne quelque chose d'autre, cela pourrait causer le problème.

0

Avez-vous activé la validation côté client? Il peut même s'agir d'un correctif hacky rapide, mais en ce qui concerne le message d'erreur, il est difficile de le dire sans informations supplémentaires. Pourriez-vous poster votre View et le Html rendu? À quoi ressemble votre itinéraire pour les détails? Si vous définissez un point d'arrêt au début de la méthode Details, est-il frappé lorsque vous cliquez sur le bouton submit?

0

Il semble que vous pouvez simplement déclarer vos ThingsViewModel comme ceci:

public class ThingsViewModel: IEnumerable<Thing> 

puis implémenter l'interface selon le cas pour accéder à la liste des choses.

0

Je pense que ASP.NET MVC pourrait essayer de mapper votre vue sur le mauvais contrôleur. Lorsque vous revenez à la vue, vous devrez peut-être spécifier le nom du fichier de vue que vous essayez d'utiliser.

retour vue ("ViewName")

Questions connexes