Net*_*aSW 100 razor asp.net-mvc-4
在这一行:
@Html.ActionLink("Reply", "BlogReplyCommentAdd", "Blog",
new { blogPostId = blogPostId, replyblogPostmodel = Model,
captchaValid = Model.AddNewComment.DisplayCaptcha })
Run Code Online (Sandbox Code Playgroud)
我在blogPostId上遇到以下运行时错误:
参数字典包含参数'blogPostId'的非可空类型'System.Int32'的空条目,用于方法'System.Web.Mvc.ActionResult BlogReplyCommentAdd(Int32,Nop.Web.Models.Blogs.BlogPostModel,Boolean)'in 'Nop.Web.Controllers.BlogController'.可选参数必须是引用类型,可空类型,或者声明为可选参数.参数名称:参数
我已经为此分配了一个值,例如
@{
var blogPostId = Model.Id;
}
Run Code Online (Sandbox Code Playgroud)
我的控制器:
public ActionResult BlogReplyCommentAdd(int blogPostId, BlogPostModel model, bool captchaValid)
{}
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么?请举个例子.
Dar*_*rov 240
您正在使用帮助程序的错误重载Html.ActionLink.你的想法routeValues实际上是htmlAttributes!只需查看生成的HTML,您将看到此锚点的href属性看起来不像您期望的那样.
这是你正在使用的:
@Html.ActionLink(
"Reply", // linkText
"BlogReplyCommentAdd", // actionName
"Blog", // routeValues
new { // htmlAttributes
blogPostId = blogPostId,
replyblogPostmodel = Model,
captchaValid = Model.AddNewComment.DisplayCaptcha
}
)
Run Code Online (Sandbox Code Playgroud)
这是你应该使用的:
@Html.ActionLink(
"Reply", // linkText
"BlogReplyCommentAdd", // actionName
"Blog", // controllerName
new { // routeValues
blogPostId = blogPostId,
replyblogPostmodel = Model,
captchaValid = Model.AddNewComment.DisplayCaptcha
},
null // htmlAttributes
)
Run Code Online (Sandbox Code Playgroud)
您的代码还有另一个非常严重的问题.以下routeValue:
replyblogPostmodel = Model
Run Code Online (Sandbox Code Playgroud)
你不可能在ActionLink中传递这样的复杂对象.因此,摆脱它,并BlogPostModel从控制器操作中删除参数.您应该使用该blogPostId参数从保持此模型的任何位置检索模型,或者如果您更喜欢在GET操作中检索模型的位置:
public ActionResult BlogReplyCommentAdd(int blogPostId, bool captchaValid)
{
BlogPostModel model = repository.Get(blogPostId);
...
}
Run Code Online (Sandbox Code Playgroud)
至于你最初的问题与错误的重载有关,我建议你使用命名参数编写助手:
@Html.ActionLink(
linkText: "Reply",
actionName: "BlogReplyCommentAdd",
controllerName: "Blog",
routeValues: new {
blogPostId = blogPostId,
captchaValid = Model.AddNewComment.DisplayCaptcha
},
htmlAttributes: null
)
Run Code Online (Sandbox Code Playgroud)
现在,不仅你的代码更具可读性,而且你永远不会在微软为这些帮助者做出的重载之间产生混淆.
Mun*_*niR 12
我必须传递两个参数,如:
/控制器/动作/ Param1Value/Param2Value
这条路:
@Html.ActionLink(
linkText,
actionName,
controllerName,
routeValues: new {
Param1Name= Param1Value,
Param2Name = Param2Value
},
htmlAttributes: null
)
Run Code Online (Sandbox Code Playgroud)
将生成此网址
/控制器/动作/ Param1Value?Param2Name = Param2Value
我通过在参数1中合并参数二使用了一种变通方法,我得到了我想要的东西:
@Html.ActionLink(
linkText,
actionName,
controllerName,
routeValues: new {
Param1Name= "Param1Value / Param2Value" ,
},
htmlAttributes: null
)
Run Code Online (Sandbox Code Playgroud)
我得到:
/控制器/动作/ Param1Value/Param2Value
您可以使用以下方法传递值。
@Html.ActionLink("About", "About", "Home",new { name = ViewBag.Name }, htmlAttributes:null )
Run Code Online (Sandbox Code Playgroud)
控制器:
public ActionResult About(string name)
{
ViewBag.Message = "Your application description page.";
ViewBag.NameTransfer = name;
return View();
}
Run Code Online (Sandbox Code Playgroud)
网址看起来像
http://localhost:50297/Home/About?name=My%20Name%20is%20Vijay
Run Code Online (Sandbox Code Playgroud)