製品があり、製品のレビューを残すことができる Web サイトを構築しています。製品ページに「レビューを残す」というリンクがあります
私のコードでは、次のようになります。
@Html.ActionLink("Leave a Review", "AddReview", "Product", new { id = Model.ProductId }, null)
アプリケーションを実行するとリンクは正常に機能しますが、レビューを送信するとクラッシュし、次のように表示されます。
パラメーター ディクショナリには、'MyProject.Controllers.ProductController' のメソッド 'System.Web.Mvc.ActionResult Product(System.String, Int32)' の null 非許容型 'System.Int32' のパラメーター 'id' の null エントリが含まれています。オプションのパラメーターは、参照型または null 許容型であるか、オプションのパラメーターとして宣言する必要があります。パラメータ名: パラメータ
このエラーnew { id = Model.ProductId }
は、ActionLink にある場合にのみ発生します。
ProductId が null のように見えるかもしれませんが、それは不可能です。最初に製品ページを読み込むには、ProductId が必要です。さらに、同じ ID を使用してその製品に関するレビューをページに表示する RenderAction を使用します。
@{Html.RenderAction("Reviews", "product", new { id = Model.ProductId});}
基本的に、なぜこのエラーが発生するのですか? GET と POST の AddReview メソッドがあることと何か関係がありますか? リンクがGETをプルすることを考慮すべきではないと思います。フォームを送信すると、それはPOSTになるはずです。productId をフォームに取得するにはどうすればよいですか?
編集 いくつかの質問に答えるには:
私のフォームは次のようになります。
@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");
}
生成されたタグは次のようになります。
<a href="/Product/AddReview?ProductId=9">Leave a Review</a>
編集
リンクの問題を修正した後、まだエラーが発生している理由は、コントローラーで RedirectToAction 呼び出しが壊れていたためであることに気付きました。なんて愚かな間違いでしょう!