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

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


Vij*_* Vj 5

您可以使用以下方法传递值。

@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)