将参数从@ Html.ActionLink MVC 4传递给控制器

在这一行中:

@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)'的非空types'System.Int32'的参数'blogPostId' 'Nop.Web.Controllers.BlogController'。 可选参数必须是引用types,可为空types,或者声明为可选参数。 参数名称:参数

我已经为此分配了一个值,比如

  @{ 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参数。 您应该使用blogPostId参数从持续存在此模型的任何位置检索模型,或者如果您更喜欢从GET操作中检索模型的位置:

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

至于你最初的问题是关于错误的超载,我会build议你使用命名参数编写你的助手:

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

现在,不仅您的代码更具可读性,而且您也不会在微软为这些帮助者所做的超载超文本之间产生混淆。

我必须传递两个参数,如:

/控制器/动作/ Param1Value / Param2Value

这条路:

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

会产生这个url

/控制器/动作/ Param1Value?Param2Name = Param2Value

我通过在参数一中合并参数二使用了一种解决方法,我得到了我想要的:

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

我得到:

/控制器/动作/ Param1Value / Param2Value

问题必须与值为Model.Id的值为null。 你可以通过赋值来确认,例如

 @{ var blogPostId = 1; } 

如果错误消失,那么你需要确保你的模型ID有一个值,然后传递给视图