将参数从@ 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有一个值,然后传递给视图
- 如何使用双层架构将UseEmbeddedHttpServer设置为true时,使我的RavenDB应用程序正确执行?
- 无法在MVC4 Web API中加载文件或程序集“System.Net.Http,Version = 2.0.0.0”
- 在asp.net mvc中格式化datetime 4
- 使用.NET 4.0任务模式将JSON反序列化为使用HTTPClient .ReadAsAsync的数组或列表
- 在Asp.Net Mvc中使用Cookie
- 在应用程序configuration文件中找不到名为“MyEntities”的连接string
- 为什么ASP.NET MVC 4有这么多的NuGet包,哪些是真正重要的?
- 如何强制BundleCollection刷新MVC4中的caching脚本包
- MVC4减去捆绑@import目录