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



本行:

@Html.ActionLink("Reply", "BlogReplyCommentAdd", "Blog",
         new { blogPostId = blogPostId, replyblogPostmodel = Model,
         captchaValid = Model.AddNewComment.DisplayCaptcha })

我得到以下运行时错误的blogpostd:

parameters字典包含一个空的parameter条目非空类型的' blogpostd '。Int32' for方法"System.Web.Mvc.ActionResult BlogReplyCommentAdd (Int32,Nop.Web.Models.Blogs。BlogPostModel, Boolean)' in"Nop.Web.Controllers.BlogController"。可选参数必须为a引用类型、可空类型或声明为可选类型参数。参数名称:parameters

我已经在上面为它赋了一个值,比如

    @{         
        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参数从保存模型的任何地方检索模型,或者如果您愿意,从在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
)

现在,不仅你的代码可读性更强,而且你永远不会对微软为这些帮助程序所做的无数的重载感到困惑。

我必须传递两个参数:

/控制器/动作/Param1Value/Param2Value

:

@Html.ActionLink(
    linkText,
    actionName,
    controllerName,
    routeValues: new {
        Param1Name= Param1Value, 
        Param2Name = Param2Value 
    },
    htmlAttributes: null
)

将生成这个url

/控制器/动作/Param1Value吗?Param2Name = Param2Value

我使用了一个变通方法,通过将参数2合并到参数1中,我得到了我想要的:

@Html.ActionLink(
    linkText,
    actionName,
    controllerName,
    routeValues: new {
        Param1Name= "Param1Value / Param2Value" ,      
    },
    htmlAttributes: null
)

得到:

/控制器/动作/Param1Value/Param2Value

您可以使用下面的方式传递值。

@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

问题一定出在值Model上。Id为空。你可以通过赋值来确认,例如

@{         
     var blogPostId = 1;          
 }

如果错误消失了,那么你需要确保你的模型Id在传递给视图之前有一个值

最新更新