2010-08-04 6 views
0

Je ne fais que commencer avec ASP.NET MVC et j'utilise NHibernate pour mon contexte de données. J'ai gardé les champs de clés étrangères dans mes classes d'entités afin de faciliter le travail avec les listes déroulantes, mais ce n'est pas le cas.ASP.NET MVC - NHibernate - DropDownLists

Voici mon post retour l'action:

var user = userRepository.GetById(id); 

if (!TryUpdateModel(user, "User", new[] { "UserName", "RoleID" })) 
    return View(user); 

// Update the role 
user.Role = roleRepository.GetById(user.RoleID); 

Cela me permet de mettre ma logique de validation sur la propriété User.RoleID.

Tout fonctionne bien jusqu'à ce qu'il l'enregistre. Voici mon utilisateur et la classe de mappage:

public virtual int UserID { get; set; } 

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

[Required(ErrorMessage = "Role is required")] 
public virtual int RoleID { get; set; } 

public virtual Role Role { get; set; } 

public UserMap() 
{ 
    Table("Users"); 
    Id(x => x.UserID); 
    Map(x => x.UserName); 
    Map(x => x.RoleID); 
    References(x => x.Role, "RoleID"); 
} 

Cependant, cela renvoie une erreur lors de la validation des modifications. J'ai essayé d'enlever la carte (x => x.RoleID); à partir du mappage ci-dessus et l'insertion s'est déroulée avec succès, mais les données n'ont pas été remplies lors de l'affichage de l'utilisateur.

Ma solution préférée serait de supprimer la propriété RoleID de l'entité User (comme recommandé par NHibernate) mais je devrais alors gérer ma logique de validation moi-même.

J'apprécierais que quelqu'un puisse vous aider. Merci

+0

Quelle est exactement l'erreur? –

+0

Index 3 invalide pour ce SqlParameterCollection avec Count = 3. – nfplee

Répondre

0

j'ai trouvé la meilleure façon de le faire est de dire ce qui suit:

[HttpPost, ValidateAntiForgeryToken] 
public ActionResult Create(FormCollection collection) 
{ 
    var user = new User(); 

    if (!TryUpdateModel(user, new[] { "UserName", "Role" })) 
     return View(user); 

    ... 
} 

[HttpPost, ValidateAntiForgeryToken] 
public ActionResult Edit(int id, FormCollection collection, string returnUrl) 
{ 
    var user = userRepository.GetById(id); 
    user.Role = new Role(); // Needed to prevent another issue when saving 

    if (!TryUpdateModel(user, new[] { "UserName", "Role" })) 
     return View(user); 

    ... 
} 

Pour l'instant je suis relativement satisfait de ma solution hacky mais si quelqu'un sait comment je peux me débarrasser de la user.Role = nouveau rôle(); Dans l'action Modifier, j'apprécierais qu'ils puissent partager. Merci

btw si vous retournez plusieurs données à la vue lorsque votre validation échoue et que vous devez faire un get (par exemple pour récupérer les rôles). Ensuite, vous devez annuler les modifications que vous avez effectuées dans la transaction nhibernate pour éviter un autre problème. J'espère que cela fait gagner du temps à quelqu'un :)

Questions connexes