2012-04-16 3 views
0

Je construis un site Web où il y a des produits et vous pouvez laisser des commentaires sur les produits. J'ai un lien sur la page du produit qui dit: « Laisser un avis »ActionLink et les paramètres

Dans mon code, il ressemble à ceci:

@Html.ActionLink("Leave a Review", "AddReview", "Product", new { id = Model.ProductId }, null) 

Quand je lance mon application le lien fonctionne très bien, mais lorsque je soumets une critique il se bloque et dit:

Le dictionnaire des paramètres contient une entrée nulle pour le paramètre « id » de type non annulable « System.Int32 » pour la méthode « System.Web.Mvc.ActionResult produit (System.String , Int32) 'dans ' MyProject.Controllers.P roductController '. Un paramètre facultatif doit être un type de référence, un type Nullable ou être déclaré en tant que paramètre facultatif . Nom du paramètre: paramètres

Cette erreur se produit uniquement si j'ai new { id = Model.ProductId } dans mon ActionLink.

Cela peut sembler que le ProductId est null, mais ce n'est pas possible. Pour charger la page du produit en premier lieu un ProductId est nécessaire, plus j'utiliser un RenderAction qui affiche des commentaires sur ce produit sur la page en utilisant le même identifiant:

@{Html.RenderAction("Reviews", "product", new { id = Model.ProductId});} 

Donc, fondamentalement, pourquoi je reçois cette erreur ? Cela a-t-il quelque chose à voir avec une méthode GET et POST AddReview? Je ne pense pas qu'il devrait considérer le lien tirer l'EEG et quand je soumets le formulaire, il devrait être un POST. Comment puis-je obtenir le productId dans le formulaire?

EDIT Pour répondre à certaines questions:

Ma forme ressemble à ceci:

@using (Html.BeginForm("AddReview", "Product")) 
{ 
    <p>Title @Html.TextBoxFor(x => x.Title)</p> 
    <p>Rating: @Html.TextBoxFor(x => x.Rating)</p> 
    <p>Body: @Html.TextBoxFor(x => x.Body)</p> 
    <input type="submit" value="Save"/> 
    Html.ActionLink("Cancel", "Index", "Home"); 
} 

Mon étiquette générée ressemble à ceci:

<a href="/Product/AddReview?ProductId=9">Leave a Review</a> 

EDIT

Après avoir résolu le problème de lien, j'ai réalisé que la raison pour laquelle je recevais toujours une erreur était en raison d'un appel RedirectToAction a été rompu dans mon contrôleur. Quelle erreur stupide!

Répondre

2
@Html.ActionLink("Leave a Review", "AddReview", "Product", new { @id = Model.ProductId }, null) 

Cela devrait générer un lien comme ci-dessous si vous avez un Valie valide dans votre propriété ProductID pour ce modèle

<a href="/Product/AddReview/9">Leave a Review</a> 

Assurez-vous de la valeur de la propriété ProductId chargée correctement.

vous pouvez utiliser le symbole @ comme préfixe aux paramètres qui a le même nom que les attributions HTML. Voir j'ai utilisé @id au lieu de id

+0

Cela génère le lien approprié. Je reçois toujours l'erreur et je suppose que c'est parce que je ne charge pas la valeur dans mon formulaire correctement ... – Johannes

+0

Et pourtant, la critique publie encore. – Johannes

0

Il semble que vous ne définissez pas ProductId dans le formulaire. Vous devez soit définir l'action de formulaire pour inclure l'ID dans l'itinéraire: @Html.BeginForm("AddReview","Product", new {Id = Model.ProductId}) ou inclure une entrée masquée pour l'ID de produit, par exemple. @Html.Hidden("id",Model.ProductId")

+0

Comment puis-je passer l'ID dans le formulaire alors? – Johannes

+0

@DarinDimitrov, il est préférable de passer l'ID dans le formulaire d'action ou dans un caché? Avantages et inconvénients ... – Romias

+0

@Romias Je pense que la valeur du formulaire gagne si elles sont différentes. –

2
<a href="/Product/AddReview?ProductId=9">Leave a Review</a> 

est pas bon. Vous devriez obtenir:

<a href="/Product/AddReview/9">Leave a Review</a> 

ou:

<a href="/Product/AddReview?id=9">Leave a Review</a> 

parce que votre action du contrôleur attend un paramètre non-nullable int appelé id.La raison pour laquelle vous obtenez cette mauvaise URL peut-être parce que vous avez raté vos routes.

+0

Je n'ai pas touché mes routes cependant. C'est la configuration par défaut {controller}/{action}/{id}. – Johannes

+0

Peut-être que c'est votre forme alors. Avez-vous essayé d'inclure le paramètre route: '@using (Html.BeginForm (" AddReview "," Product ", nouveau {id = Model.ProductId}, FormMethod.Post))'? –

+0

Donc, je reçois l'erreur mais les commentaires postent toujours. C'est bête. – Johannes