在这一行:
@Html.ActionLink("Reply", "BlogReplyCommentAdd", "Blog",
new { blogPostId = blogPostId, replyblogPostmodel = Model,
captchaValid = Model.AddNewComment.DisplayCaptcha })
我得到blogPostId以下运行时错误:
参数字典包含参数在一个空条目非空类型“System.Int32”的“blogPostId”的方法“System.Web.Mvc.ActionResult BlogReplyCommentAdd(的Int32,Nop.Web.Models.Blogs.BlogPostModel,布尔值)” 'Nop.Web.Controllers.BlogController'。 一个可选的参数必须是引用类型,可空类型,或声明为一个可选参数。 参数名:参数
我已经为这个在上面指定的值,如
@{
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
参数来检索模型从哪里这种模式持续下去,或者如果你无论你检索在我们采取行动的模型喜欢:
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
)
现在,不仅是你的代码更易读,但你永远不会有重载,微软为那些助手做的gazillions之间的混淆。
我必须要通过两个参数,如:
/控制器/动作/ Param1Value / Param2Value
这条路:
@Html.ActionLink(
linkText,
actionName,
controllerName,
routeValues: new {
Param1Name= Param1Value,
Param2Name = Param2Value
},
htmlAttributes: null
)
就会产生此网址
/控制器/动作/ Param1Value?Param2Name = Param2Value
我在参数一个合并参数的两个使用的变通办法,我得到了我想要的东西:
@Html.ActionLink(
linkText,
actionName,
controllerName,
routeValues: new {
Param1Name= "Param1Value / Param2Value" ,
},
htmlAttributes: null
)
而我得到:
/控制器/动作/ Param1Value / Param2Value
这个问题必须与价值Model.Id这是空。 您可以通过分配值,例如确认
@{
var blogPostId = 1;
}
如果错误disappers,然后u需要将它传递给视图前,请确保您的模型ID具有值