2010-05-05 5 views
1

J'ai cherché comme un fou, mais ne va pas beaucoup plus intelligent pour elle ..MVC 2 cadre de validation et de l'entité

Dans mon projet, j'utiliser Entity Framework 4 et propres classes PoCo et je veux utiliser DataAnnotations pour validation. Aucun problème là, c'est combien de temps sur Internet sur la façon dont je le fais. Cependant, je pense qu'il vaut mieux avoir ma validation dans ViewModels et ne pas laisser mes vues utiliser mes classes POCO pour afficher des données. Comment dois-je faire cela en douceur? Depuis mes dépôts renvoie obejekt de mes classes POCO j'ai essayé d'utiliser AutoMapper pour obtenir tout pour travailler mais quand j'essaie de mettre à jour ou de changer quoi que ce soit dans le ModelState.IsValid est faux tout le temps ..

Mon anglais est vraiment mauvais, essayez de montrer comment je fais à la place aujourd'hui: mon POCO

public partial User { 
    public int Id { get; set; } 
    public string UserName { get; set; } 
    public string Password { get; set; } 
} 

Et mon ViewModel

public class UserViewModel { 
    public int Id { get; set; } 

    [Required(ErrorMessage = "Required")] 
    public string UserName { get; set; } 

    [Required(ErrorMessage = "Required")] 
    public string Password { get; set; } 
} 

Controller:

public ActionResult Edit(int id) { 
    User user = _userRepository.GetUser(id); 
    UserViewModel mappedUser = Mapper.Map<User, UserViewModel>(user); 

    AstronomiGuidenModelItem<UserViewModel> result = new AstronomiGuidenModelItem<UserViewModel> { 
     Item = mappedUser 
    }; 

    return View(result); 
} 

[HttpPost] 
public ActionResult Edit(UserViewModel viewModel) { 
    User user = _userRepository.GetUser(viewModel.Id); 
    Mapper.Map<UserViewModel, User>(viewModel, user);  

    if (ModelState.IsValid) { 
     _userRepository.EditUser(user); 

     return Redirect("/"); 
    } 

    AstronomiGuidenModelItem<UserViewModel> result = new AstronomiGuidenModelItem<UserViewModel> { 
     Item = viewModel 
    }; 

    return View(result); 
} 

J'ai remarqué que ma validation fonctionne correctement, mais mes valeurs sont nulles lorsque j'essaie d'envoyer et de mettre à jour la base de données. J'ai une principale ViewModel qui ressemble à ceci:

public class AstronomiGuidenModelItem<T> : AstronomiGuidenModel { 
    public T Item { get; set; } 
} 

Pourquoi r mon « UserViewModel viewmodel » null alors je tente de modifier?

Répondre

1

Si la validation fonctionne, alors UserViewModel viewModel ne devrait pas être nul ... ou est-ce que la validation côté client fonctionne mais pas le côté serveur?

Si c'est le cas, cela pourrait être dû au code HTML généré.

Par exemple, si à votre avis vous:

<%: Html.TextBoxFor(x => x.Item.UserName) %> 

Le html qui obtient rendu pourrait être:

<input name="Item.UserName" id="Item_UserName" /> 

Lorsque cela devient à la liaison sur le serveur, il aura besoin votre paramètre d'action doit être nommé comme le préfixe de l'entrée (Item). Par exemple.

public ActionResult Edit(UserViewModel item) { 

Pour contourner ce problème, faites comme ci-dessus et changer vos paramètres d'action à item ou vous pouvez résumer la forme dans un PartialView séparé qui prend la UserViewModel comme il est modèle - de cette façon la Html.TextBoxFor ne sera pas rendu avec un préfixe.

HTHS,
Charles

Ps. Si je suis complètement hors piste, pourriez-vous s'il vous plaît poster un code pour la vue.

+0

J'ai trouvé le problème idiot, 'UserViewModel' devrait être' AstronomiGuidenModelItem '. –