この行で:
@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)
{}
私は何か悪いことをしていますか?例を挙げてください。
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がこれらのヘルパーのために作成した膨大な数の過負荷を混同することもありません。
私は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
以下を使って値を渡すことができます。
@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
問題は、Model.Idの値がnullであることです。値を代入することで確認できます。
@{
var blogPostId = 1;
}
エラーが消える場合は、モデルIDをビューに渡す前にモデルIDに値があることを確認する必要があります。