web-dev-qa-db-ja.com

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

この行で:

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

BlogPostIdに次のようなランタイムエラーが表示されます。

パラメーター・ディクショナリーに、メソッド 'System.Web.Mvc.ActionResult'のSystem.Int32 '型のNULL値不可タイプ' System.Int32 'のパラメーター' blogPostId 'のNULL項目が含まれています'Nop.Web.Controllers.BlogController'。オプションのパラメータは、参照型、NULL可能型、またはオプションのパラメータとして宣言する必要があります。パラメータ名:parameters

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

    @{         
        var blogPostId = Model.Id;          
     }

私のコントローラー:

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

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

93
NetraSW

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パラメータを削除してください。このモデルが保持されている場所からモデルを取得する場合、またはGETアクションでモデルを取得した場所からモデルを取得する場合は、blogPostIdパラメータを使用します。

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がこれらのヘルパーのために作成した膨大な数の過負荷を混同することもありません。

231
Darin Dimitrov

私は2つのパラメータを渡す必要があります:

/コントローラ/アクション/ 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
)

そして私は得ます:

/コントローラ/アクション/ Param1Value/Param2Value

12
MuniR

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

@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
2
Vijay Vj

問題は、Model.Idの値がnullであることです。値を代入することで確認できます。

@{         
     var blogPostId = 1;          
 }

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

0
sawe