【问题标题】:Passing multiple parameters to action将多个参数传递给操作
【发布时间】:2012-12-22 17:45:01
【问题描述】:

我正在尝试通过执行以下操作将多个参数传递给控制器​​中的操作:

@Html.ActionLink("Set", "Item", "Index", new { model = Model, product = p }, null)

我的操作方法如下所示:

public ActionResult Item(Pro model, Pro pro)
{
   ...
}

问题是调用方法时action方法中的modelproductToBuy变量都是null。怎么会?

【问题讨论】:

  • 你不能传递复杂的对象,因为这个答案建议stackoverflow.com/a/4197843/168097
  • @Circadian 引用的帖子很好地解释了您可以序列化复杂对象并将其传递给您的控制器,但它也是一个坏主意。恕我直言——在这个领域有很多潜在的混淆。考虑典型的编辑/编辑-保存场景,感觉我们的模型对象从服务器到客户端再返回,作为一个对象。但这只是默认 ModelBinding 代表我们实施的一个技巧。

标签: c# asp.net-mvc-3 asp.net-mvc-routing


【解决方案1】:

不能发送复杂对象作为路由参数。因为它在传递给操作方法时会转换为查询字符串。因此始终需要使用原始数据类型

它应该如下所示(示例)

@Html.ActionLink("Return to Incentives", "provider", new { action = "index", controller = "incentives" , providerKey = Model.Key }, new { @class = "actionButton" })

您的路由表应如下所示。由原始数据类型组成。

 routes.MapRoute(
     "Default", // Route name
     "{controller}/{action}/{id}", // URL with parameters
     new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );

解决方案 1

您可以使用 ActionLink 将模型的 Id 作为参数发送,然后从数据库中获取必要的对象,以便在控制器的操作方法中进行进一步处理。

解决方案 2

您可以使用 TempData 将对象从一种操作方法发送到另一种操作方法。它只是在控制器操作之间共享数据。您应该只在当前和后续请求期间使用它。

举个例子

型号

public class CreditCardInfo
{
    public string CardNumber { get; set; }
    public int ExpiryMonth { get; set; }
 }

操作方法

[HttpPost]
public ActionResult CreateOwnerCreditCardPayments(CreditCard cc,FormCollection frm)
  {
        var creditCardInfo = new CreditCardInfo();
        creditCardInfo.CardNumber = cc.Number;
        creditCardInfo.ExpiryMonth = cc.ExpMonth;
             
    //persist data for next request
    TempData["CreditCardInfo"] = creditCardInfo;
    return RedirectToAction("CreditCardPayment", new { providerKey = frm["providerKey"]});
  }


 [HttpGet]
 public ActionResult CreditCardPayment(string providerKey)
  {
     if (TempData["CreditCardInfo"] != null)
        {
         var creditCardInfo = TempData["CreditCardInfo"] as CreditCardInfo;
        }
      
      return View();
          
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多