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

在这一行:

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

我在 blogPostId 上得到以下运行时错误:

参数字典包含参数的空项 方法的‘ blogPostId’为非空类型‘ System.Int32’ ‘ System. Web.Mvc.ActionResult BlogReplyCommentAdd (Int32, 不。网页。模型。博客。 BlogPostModel,Boolean)’ ‘ NOP.Web.Controllers.BlogController’。可选参数必须是 引用类型、可为空的类型或声明为可选的 parameter. Parameter name: parameters

我已经在顶部为此分配了一个值,如

    @{
var blogPostId = Model.Id;
}

My Controller:

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

我做错什么了吗? 请给我举个例子。

380192 次浏览

问题一定是值 Model.Id 为 null

@{
var blogPostId = 1;
}

如果错误消失了,那么在将模型 Id 传递给视图之前,您需要确保它有一个值

您正在使用 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
)

另外,你的代码还有一个非常严重的问题:

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
)

现在,不仅您的代码更具可读性,而且您将永远不会混淆微软为这些助手提供的大量重载。

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

/Controller/Action/Param1Value/Param2Value

这边走:

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

将生成这个 url

/Controller/Action/Param1Value?Param2Name=Param2Value

I used a workaround method by merging parameter two in parameter one and I get what I wanted:

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

然后我得到了:

/Controller/Action/Param1Value/Param2Value

You can pass values by using the below .

@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();
}

网址看起来像

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