在这一行:
@Html.ActionLink("Reply", "BlogReplyCommentAdd", "Blog",
new { blogPostId = blogPostId, replyblogPostmodel = Model,
captchaValid = Model.AddNewComment.DisplayCaptcha })
我在blogPostId上遇到以下运行时错误:
参数字典包含参数的空条目 'blogPostId'为非可空类型'System.Int32'的方法 'System.Web.Mvc.ActionResult BlogReplyCommentAdd(Int32, Nop.Web.Models.Blogs.BlogPostModel,Boolean)'in 'Nop.Web.Controllers.BlogController'。可选参数必须是a 引用类型,可空类型,或声明为可选 参数。参数名称:参数
我已经为此分配了一个值,例如
@{
var blogPostId = Model.Id;
}
我的控制器:
public ActionResult BlogReplyCommentAdd(int blogPostId, BlogPostModel model, bool captchaValid)
{}
我做错了吗?请举个例子。
答案 0 :(得分:231)
您正在使用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);
...
}
就你的初始问题涉及错误的重载而言,我建议你使用命名参数编写助手:
@Html.ActionLink(
linkText: "Reply",
actionName: "BlogReplyCommentAdd",
controllerName: "Blog",
routeValues: new {
blogPostId = blogPostId,
captchaValid = Model.AddNewComment.DisplayCaptcha
},
htmlAttributes: null
)
现在,不仅你的代码更具可读性,而且你永远不会在微软为这些帮助者做出的重载之间产生混淆。
答案 1 :(得分:12)
我必须传递两个参数,如:
/控制器/动作/ Param1Value / Param2Value
这样:
$db = new MongoClient('mongodb://localhost', [
'username' => 'root',
'password' => '',
'db' => 'YOUR DB'
]);
将生成此网址
/控制器/动作/ Param1Value?Param2Name = Param2Value
我在参数1中合并参数二使用了一种变通方法,我得到了我想要的东西:
@Html.ActionLink(
linkText,
actionName,
controllerName,
routeValues: new {
Param1Name= Param1Value,
Param2Name = Param2Value
},
htmlAttributes: null
)
我得到了:
/控制器/动作/ Param1Value / Param2Value
答案 2 :(得分:0)
问题必须是Model.Id值为null。您可以通过指定值来确认,例如
@{
var blogPostId = 1;
}
如果错误消失,那么你需要确保你的模型ID在传递给视图之前有一个值
答案 3 :(得分:0)
您可以使用以下内容传递值。
@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