在 C# ASP.NET MVC 模式中使用 RedirectToAction 将 ViewData 传递给 ActionResult

Pass ViewData to ActionResult using RedirectToAction in C# ASP.NET MVC Pattern

我有一个表单,一旦提交,将根据输入的内容结合服务器端计算进行一些复杂的路由。我想通过 RedirectToAction 将从第一种形式收集的数据传递给第二种形式。

起初我以为我可以执行 RedirectToAction 以通过 POST 方法干净地传递数据,但似乎没有简单的方法可以做到这一点。阅读更多 我想看看是否有一些简单的方法可以通过 RedirectToAction 将 Hashtable 或 ViewData 传递到正确的 ActionResult 并读取变量,但这比我想象的更具挑战性。

这是我正在尝试的简化版本。

[AcceptVerbs("GET","POST")]
public ActionResult Step8(int id = 0, Hashtable FormValues = null) {

    // was this a redirect back to us?
    if (FormValues != null && FormValues.Count > 0) {
        if (FormValues.ContainsKey("title") && FormValues["title"] != null) {
            string _title = FormValues["title"].ToString();
        }
    }
    // the form in thie view redirects to Step9
    return View(); 
}

[AcceptVerbs("POST")]
public ActionResult Step9(int id = 0) {
    bool issue_found = true;

    if(issue_found){
        // hypothetical issue found, back to previous step
        Hashtable _FormValues = new Hashtable();
        _FormValues.Add("title", "My Title");
        _FormValues.Add("product", "My thing");
        return this.RedirectToAction("Step8", _FormValues);
    }else{
        // .. do stuff
        return View();
    }   
}

我做错了什么?我怎样才能传递这些数据?

该方法比需要的更复杂。 TempDataRedirect 中幸存下来,所以这就是我所做的。这是一个可行的解决方案:

[AcceptVerbs("GET","POST")]
public ActionResult Step8(int id = 0) {

    string _product = "";
    string _title = "";

    // was this a redirect back to us?
    try {
        if (TempData != null) {
            if (TempData.ContainsKey("product") && TempData["product"] != null) {
                _product = TempData["product"].ToString();
            }
            if (TempData.ContainsKey("title") && TempData["title"] != null) {
                _title = TempData["title"].ToString();
            }
        }
    } catch {}

    // The form in this view performs a POST to Step9
    return View(); 
}

[AcceptVerbs("POST")]
public ActionResult Step9(int id = 0) {
    bool issue_found = true;

    if(issue_found){
        // hypothetical issue found, back to previous step

        TempData["title"] = "My Title";
        TempData["product"] = "My thing";
        return this.RedirectToAction("Step8");
    }else{
        // .. do stuff
        return View();
    }   
}