如何在Redirecttoaction中传递List

时间:2012-08-24 11:42:29

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

我想从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)
    {
    }

我没有在模型中获取值。

4 个答案:

答案 0 :(得分:22)

重定向时,您无法在网址中传递复杂对象的集合。

一种可能性是使用TempData:

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

然后在问题行动中:

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

答案 1 :(得分: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){}

答案 2 :(得分:1)

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

假设repositary.GetTabelFieldsFromID从Id

返回TabelFields的列表

答案 3 :(得分:1)

我解决这个问题的方法是使用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);
}

重要,这会将模型作为查询字符串参数添加到您的网址,因此只能使用非常简单的小对象,否则您的网址会太长。