@ Html.ActionLink MVC 4からコントローラーにパラメーターを渡す


109

この行では:

@Html.ActionLink("Reply", "BlogReplyCommentAdd", "Blog",
         new { blogPostId = blogPostId, replyblogPostmodel = Model,
         captchaValid = Model.AddNewComment.DisplayCaptcha })

blogPostIdで次のランタイムエラーが発生します。

パラメータディクショナリには、メソッド 'System.Web.Mvc.ActionResult BlogReplyCommentAdd(Int32、Nop.Web.Models.Blogs.BlogPostModel、Boolean)'のnullにできないタイプ 'System.Int32'のパラメータ 'blogPostId'のnullエントリが含まれています「Nop.Web.Controllers.BlogController」。オプションのパラメーターは、参照型、null許容型、またはオプションのパラメーターとして宣言する必要があります。パラメータ名:パラメータ

私はすでにこの上に値を割り当てています

    @{         
        var blogPostId = Model.Id;          
     }

私のコントローラー:

 public ActionResult BlogReplyCommentAdd(int blogPostId, BlogPostModel model, bool captchaValid)
    {}

私は何か間違ったことをしていますか?例を挙げてください。

回答:


257

Html.ActionLinkヘルパーの誤ったオーバーロードを使用しています。あなたが思うことrouteValuesは実際にhtmlAttributesです!生成されたHTMLを見るだけで、このアンカーのhrefプロパティが期待どおりに表示されないことがわかります。

これはあなたが使っているものです:

@Html.ActionLink(
    "Reply",                                                  // linkText
    "BlogReplyCommentAdd",                                    // actionName
    "Blog",                                                   // routeValues
    new {                                                     // htmlAttributes
        blogPostId = blogPostId, 
        replyblogPostmodel = Model, 
        captchaValid = Model.AddNewComment.DisplayCaptcha 
    }
)

そしてこれがあなたが使うべきものです:

@Html.ActionLink(
    "Reply",                                                  // linkText
    "BlogReplyCommentAdd",                                    // actionName
    "Blog",                                                   // controllerName
    new {                                                     // routeValues
        blogPostId = blogPostId, 
        replyblogPostmodel = Model, 
        captchaValid = Model.AddNewComment.DisplayCaptcha 
    },
    null                                                      // htmlAttributes
)

また、コードには別の非常に深刻な問題があります。次のrouteValue:

replyblogPostmodel = Model

このような複雑なオブジェクトをActionLinkで渡すことはできません。そのため、それを取り除き、BlogPostModelコントローラーアクションからパラメーターを削除します。blogPostIdパラメータを使用して、このモデルが永続化されている場所からモデルを取得するか、GETアクションでモデルを取得した場所から取得する必要があります。

public ActionResult BlogReplyCommentAdd(int blogPostId, bool captchaValid)
{
    BlogPostModel model = repository.Get(blogPostId);
    ...
}

最初の問題が誤ったオーバーロードに関係している限り、名前付きパラメーターを使用してヘルパーを作成することをお勧めします。

@Html.ActionLink(
    linkText: "Reply",
    actionName: "BlogReplyCommentAdd",
    controllerName: "Blog",
    routeValues: new {
        blogPostId = blogPostId, 
        captchaValid = Model.AddNewComment.DisplayCaptcha
    },
    htmlAttributes: null
)

これで、コードが読みやすくなるだけでなく、Microsoftがヘルパーのために作成した膨大な数のオーバーロードを混同することもなくなります。


あなたはコメントを変更する必要があるcontrollerNameactionName
webdeveloper

@DarinDimitrov:モデルをパラメーターとして渡す方法は?
NetraSW 2013年

1
@ DarinDimitrov、@ webdeveloper:actionresultで[httppost]について言及する必要がありますか?
NetraSW 2013年

@NetraSW、[HttpPost]リンクがGETリクエストを送信しているため、アクションを実行する必要はありません。[HttpPost]つまり、コントローラーアクションはPOSTリクエストでのみアクセスできます。
Darin Dimitrov 2013年

@DarinDimitrov:これを実現するにはどうすればよいですか?モデルはプロパティ値を空に送信します。案内してください。
NetraSW 2013年

12

次のような2つのパラメータを渡す必要があります。

/ Controller / Action / Param1Value / Param2Value

こちらです:

@Html.ActionLink(
    linkText,
    actionName,
    controllerName,
    routeValues: new {
        Param1Name= Param1Value, 
        Param2Name = Param2Value 
    },
    htmlAttributes: null
)

このURLを生成します

/ Controller / Action / Param1Value?Param2Name = Param2Value

私はパラメーター2をパラメーター1にマージすることで回避策の方法を使用し、私が望むものを取得します:

@Html.ActionLink(
    linkText,
    actionName,
    controllerName,
    routeValues: new {
        Param1Name= "Param1Value / Param2Value" ,      
    },
    htmlAttributes: null
)

そして私は得る:

/ Controller / Action / Param1Value / Param2Value


どうやら、これはParam1Valueがnullのときに発生します。同じ問題が発生しました。
AFract

3

以下を使用して値を渡すことができます。

@Html.ActionLink("About", "About", "Home",new { name = ViewBag.Name }, htmlAttributes:null )

コントローラ:

public ActionResult About(string name)
        {
            ViewBag.Message = "Your application description page.";
            ViewBag.NameTransfer = name;
            return View();
        }

そしてURLは次のようになります

http://localhost:50297/Home/About?name=My%20Name%20is%20Vijay

0

問題はnullである値Model.Idにある必要があります。値を割り当てることで確認できます。

@{         
     var blogPostId = 1;          
 }

エラーが消えた場合、ビューに渡す前に、モデルIDに値があることを確認する必要があります。


1
いいえ、それは問題ではありません。
Darin Dimitrov 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.