【问题标题】:Pass parameter to controller from @Html.ActionLink MVC 4从@Html.ActionLink MVC 4 将参数传递给控制器
【发布时间】:2012-12-18 14:55:40
【问题描述】:

在这一行:

@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, Boolean)' 在 'Nop.Web.Controllers.BlogController'。可选参数必须是 引用类型,可为空的类型,或被声明为可选 范围。参数名称:参数

我已经在上面为此分配了一个值,例如

    @{         
        var blogPostId = Model.Id;          
     }

我的控制器:

 public ActionResult BlogReplyCommentAdd(int blogPostId, BlogPostModel model, bool captchaValid)
    {}

我做错了吗?请举个例子。

【问题讨论】:

    标签: razor asp.net-mvc-4


    【解决方案1】:

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

    @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();
            }
    

    而且网址看起来像

    http://localhost:50297/Home/About?name=My%20Name%20is%20Vijay
    

    【讨论】:

      【解决方案2】:

      我必须传递两个参数,例如:

      /Controller/Action/Param1Value/Param2Value

      这边:

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

      会生成这个网址

      /Controller/Action/Param1Value?Param2Name=Param2Value

      我使用了一种解决方法,将参数二合并到参数一中,我得到了我想要的:

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

      我得到:

      /Controller/Action/Param1Value/Param2Value

      【讨论】:

      • 显然,当 Param1Value 为空时会发生这种情况。我刚刚遇到了同样的问题。
      【解决方案3】:

      您使用了错误的 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
      )
      

      您的代码还有另一个非常严重的问题。以下路由值:

      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
      )
      

      现在不仅您的代码更具可读性,而且您将永远不会对 Microsoft 为这些帮助程序进行的大量重载感到困惑。

      【讨论】:

      • 你需要更改 cmets controllerNameactionName
      • @DarinDimitrov:如何将模型作为参数传递?
      • @DarinDimitrov,@webdeveloper: 我需要在 actionresult 上提及 [httppost] 吗?
      • @NetraSW,您不应该在操作中使用[HttpPost],因为该链接正在发送 GET 请求。 [HttpPost] 表示您的控制器操作只能通过 POST 请求访问。
      • @DarinDimitrov:我怎么能做到这一点?模型发送属性值为空。请指导我。
      【解决方案4】:

      问题一定出在 Model.Id 为 null 的值上。您可以通过分配一个值来确认,例如

      @{         
           var blogPostId = 1;          
       }
      

      如果错误消失,那么你需要确保你的模型 ID 有一个值,然后再将它传递给视图

      【讨论】:

      • 不,这不是问题。
      猜你喜欢
      • 1970-01-01
      • 2011-02-18
      • 1970-01-01
      • 2015-05-05
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多