0

製品があり、製品のレビューを残すことができる 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 呼び出しが壊れていたためであることに気付きました。なんて愚かな間違いでしょう!

4

3 に答える 3

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

よくない。あなたは得るべきです:

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

また:

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

コントローラーのアクションは、null 非許容の int パラメーターを想定しているためidです。この間違った URL を取得している理由は、ルートを台無しにしたことが原因である可能性があります。

于 2012-04-16T16:38:30.743 に答える
2
@Html.ActionLink("Leave a Review", "AddReview", "Product", new { @id = Model.ProductId }, null)

このモデルの ProductId プロパティに有効な値がある場合、以下のようなリンクが生成されます。

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

ProductIdプロパティ値が正しくロードされていることを確認してください。

@HTML 属性と同じ名前を持つパラメータのプレフィックスとして記号を使用できます。@idの代わりに使用されているのを参照してくださいid

于 2012-04-16T16:43:26.717 に答える
0

フォームに ProductId を設定していないようです。ルートに id を含めるようにフォーム アクションを設定する必要があります:@Html.BeginForm("AddReview","Product", new {Id = Model.ProductId})または、productId の非表示の入力を含める必要があります。@Html.Hidden("id",Model.ProductId")

于 2012-04-16T16:34:44.887 に答える