从@ Html.ActionLink MVC 4传递参数控制器(Pass parameter to

2019-07-17 19:37发布

在这一行:

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

难道我做错了什么? 请给我一个例子。

Answer 1:

您正在使用的错误超载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之间的混淆。



Answer 2:

我必须要通过两个参数,如:

/控制器/动作/ 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



Answer 3:

这个问题必须与价值Model.Id这是空。 您可以通过分配值,例如确认

@{         
     var blogPostId = 1;          
 }

如果错误disappers,然后u需要将它传递给视图前,请确保您的模型ID具有值



文章来源: Pass parameter to controller from @Html.ActionLink MVC 4