2009-09-27 8 views
8

J'ai créé une table dans la base de données qui a un System.Guid comme clé primaire. Le modèle ADO.Net Entity Framework requis a été généré et les procédures stockées requises ont été mappées.L'utilisation d'un System.Guid comme clé primaire dans ASP.Net MVC?

J'ai créé un nouveau contrôleur et ajouté le code de base requis pour Créer et Modifier pour les données. Toutefois, lorsque le cliquant sur le lien pour modifier l'un enregistrement particulier l'erreur suivante est générée:

The parameters dictionary contains a null entry for parameter '[MyId]' of non-nullable type 'System.Guid' for method 'System.Web.Mvc.ActionResult Edit(System.Guid)' in '[MySite].[MyController].[SpecificController]'. To make a parameter optional its type should be either a reference type or a Nullable type. Parameter name: parameters

L'action d'édition est déclarée dans le contrôleur comme suit:

public ActionResult Edit(Guid itemId) 
{ 
    return View(); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(MyItem itemToModify) 
{ 

} 

Lors de l'ajout d'une nouvelle enregistrer le nouveau Guid est généré via une procédure stockée et la liste affiche le Guid correct. L'URL passe également le bon Guid pour la récupération.

Je n'arrive pas à capturer le point auquel cela échoue, mais comment est-ce que je passerais un System.Guid comme paramètre au contrôleur?

Répondre

17

Sauf si vous avez mis à jour vos itinéraires, il attend (par défaut) le paramètre final d'un itinéraire à être nommé "id". C'est-à-dire, si vous avez un itinéraire comme/specific/edit/5646-0767 -..., il mappera le guid dans le dictionnaire des valeurs de route avec la clé "id" quel que soit le nom du paramètre de votre méthode. Je suivrai cette convention et de changer la définition de méthode pour:

public ActionResult Edit(Guid id) 

Vous pouvez contourner ce problème, en spécifiant explicitement le nom du paramètre d'itinéraire, mais vous vous retrouvez avec une URL qui ressemble à:/spécifique/modifier? Itemid = 5646-0767 -...

+0

Maintenant, je me sens stupide de demander :( – BinaryMisfit

+0

Ne vous inquiétez pas à ce sujet - la seule raison pour laquelle je savais la réponse est que j'ai fait la même chose une fois et devais le comprendre. – tvanfosson

4

Mettre le code exemple ci-dessous pour tous ceux qui en ont besoin (je vous ai fait)

 public ActionResult Profile(Guid? id) 
    { 
     if (!id.HasValue) 
     { 
      return View(new ProfileRepository().GetUserProfile(User.Identity.Name)); 
     } 

     return View(new ProfileRepository().GetUserProfile(id.Value)); 

    } 

Merci pour le anwer ci-dessus qui m'a conduit dans le droit direction

Questions connexes