14

我想从 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的值。

4

4 回答 4

24

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

一种可能性是使用 TempData:

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

然后在问题操作中:

var model = TempData["list"] as List<QuestionClass.Tablefields>;
于 2012-08-24T12:22:52.337 回答
5

我解决此问题的方法是使用 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 会太长。

于 2018-01-31T08:31:55.633 回答
4

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

我使用简单的重定向而不是 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){}
于 2015-08-05T20:58:46.113 回答
3

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

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

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

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

假设从 Idrepositary.GetTabelFieldsFromID返回一个 ListTabelFields

于 2012-08-24T12:36:11.143 回答