【问题标题】:How to pass List in Redirecttoaction如何在 Redirecttoaction 中传递 List
【发布时间】:2012-08-24 11:42:28
【问题描述】:

我想从 RedirectToAction 方法传递多个参数

我怎样才能通过?

我的一个操作方法

 [HttpPost, ActionName("SelectQuestion")]
    public ActionResult SelectQuestion(string email,List<QuestionClass.Tabelfields> model)
    {

        List<QuestionClass.Tabelfields> fadd = new List<QuestionClass.Tabelfields>();
        for (int i = 0; i < model.Count; i++)
        {
            if (model[i].SelectedCheckbox == true)
            {
                List<QuestionClass.Tabelfields> f = new List<QuestionClass.Tabelfields>();
                fadd.Add(model[i]);
            }
        }

        return RedirectToAction("Question", new { email = email, model = fadd.ToList() });
    }

我的另一个操作方法

    [HttpGet]
    public ActionResult Question(string email,List<QuestionClass.Tabelfields> model)
    {
    }

我没有在 model 中获得值。

【问题讨论】:

    标签: c# asp.net-mvc-3 controller actionresult


    【解决方案1】:

    重定向时不能在 url 中传递复杂对象的集合。

    一种可能性是使用 TempData:

    TempData["list"] = fadd.ToList();
    return RedirectToAction("Question", new { email = email});
    

    然后在问题操作中:

    var model = TempData["list"] as List<QuestionClass.Tablefields>;
    

    【讨论】:

    • 实际上我需要在 Url 中使用电子邮件 ID 和型号。我怎样才能得到它?
    【解决方案2】:

    我解决此问题的方法是使用 Newtonsoft.Json nuget 包中的 JsonConvert 方法将列表序列化为 JSON 对象。然后可以将序列化的列表作为参数传递,然后再次反序列化以重新创建原始列表。

    因此,在您的 SelectQuestion 方法中,您将使用以下代码:

    return RedirectToAction("Question", 
        new { 
            email = email, 
            serializedModel = JsonConvert.SerializeObject(fadd.ToList()) 
        });
    

    在您的 Question 方法中,您将使用此代码来反序列化对象。

    [HttpGet]
    public ActionResult Question(string email, string serializedModel)
    {
        // Deserialize your model back to a list again here.
        List<QuestionClass.Tabelfields> model = JsonConvert.DeserializeObject<List<QuestionClass.Tabelfields>>(serializedModel);
    }
    

    重要,这会将模型作为查询字符串参数添加到您的 url,所以只能对非常简单的小对象执行此操作,否则您的 url 会太长。

    【讨论】:

    • 迄今为止最不讨厌的解决方案
    • 这个对我来说是最直接的。谢谢!
    • 不仅讨厌,而且还有效。您需要序列化以将复杂类型(例如列表)添加到 TempData
    【解决方案3】:

    这可能甚至不再活跃,但我会在这里留下我是如何做到的,以帮助其他人。

    我使用简单的重定向而不是 RedirectToAction 解决了这个问题:

    List<int> myList = myListofItems;
    var list = HttpUtility.ParseQueryString("");
    myList.ForEach(x => list.Add("parameterList", x.ToString()));
    return Redirect("/MyPath?" + list);
    

    然后,在您的其他方法上:

    public ActionResult Action(List<int> parameterList){}
    

    【讨论】:

      【解决方案4】:

      RedirectToAction 方法向浏览器返回一个 HTTP 302 响应,这会导致浏览器向指定的操作发出 GET 请求。

      您应该将数据保存在像 TempData / Session 这样的临时存储中。 TempData 使用 Session 作为后备存储。

      如果你想保持它真正的无状态,你应该在查询字符串中传递一个 id 并在你的GET Action 中获取项目列表。真正的无状态。

      return RedirectToAction("Question", new { email = email,id=model.ID });
      

      在你的 GET 方法中

      public ActionResult Question(string email,int id)
      {
      
         List<QuestionClass.Tabelfields> fadd=repositary.GetTabelFieldsFromID(id);
          //Do whatever with this
         return View();
      }
      

      假设 repositary.GetTabelFieldsFromID 从 Id 返回一个 TabelFields 列表

      【讨论】:

      • 这个 return RedirectToAction("Question", new { email = email, model = fadd.ToList() });我没有从你的回答中得到我想要的。我想通过电子邮件和列表。谢谢
      • @Ajay:正如我告诉你的,它是一个重定向(一个新的 HTTP 请求,你不能传递这样一个复杂的对象)。您需要尝试上述任何一种方法(临时存储/重新查询)。记住 HTTP 是无状态的。
      猜你喜欢
      • 2022-09-30
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 2014-04-05
      • 1970-01-01
      相关资源
      最近更新 更多