【问题标题】:Why is my array not being passed to my other controller method?为什么我的数组没有被传递给我的其他控制器方法?
【发布时间】:2016-01-24 03:08:10
【问题描述】:

我在 VS13 - MVC 5 中工作,在将数据从一个控制器方法传递到另一个控制器方法(在同一个控制器中)时遇到问题。

这是 HttpPost 控制器方法中运行良好的最后一段代码,也就是说,我已经单步执行并验证了数据正在传递到底部的 redirecttoaction 方法中,您可以在下面看到:

        ...<irrelevant code that works fine on top>...
        int[] idArray = new int[questionsToUse.Count];
        for (var i=0; i<questionsToUse.Count; i++)
        {
            idArray[i] = questionsToUse[i].QuestionId;
        }
        return RedirectToAction("ShowQuiz", new { array = idArray  });
    }

这是被重定向到的控制器方法:

    [HttpGet]
    public ActionResult ShowQuiz(int[] array)
    {
        var caseToShow = new Medcase();
        caseToShow.Title = "Quiz";
        caseToShow.Questions = new List<Question>();
        for (var i = 0; i < array.Count(); i++)
        {
            caseToShow.Questions.Add(db.Questions.Find(i));
        }
        return View(caseToShow);
    }

我在这两种方法上都设置了断点并逐步执行它们,如前所述,第一种方法可以正常工作到最后一个重定向操作行,在那里我可以在设置参数时看到数据。

但是一旦我进入下一个方法,数组值每次都只是 null 吗?谁能向我解释这是为什么?我已经在其他方法上成功地使用了这个方法,我只是将一个 int 值传递给另一个方法。这与我无法传递数组或其他东西有关吗?还是因为它发生在 httppost 方法的末尾(重定向)?

我似乎无法弄清楚出了什么问题,非常感谢所有帮助。

【问题讨论】:

  • 我发现这是因为我将它放在一个数组中,当我传递一个值时它工作正常......谁能告诉我是否有一种我可以使用的集合可以转让吗?
  • 我发现了如何使用“TempData”解决这个问题。
  • 您无法传递复杂类型,因为您正在执行重定向。这不像调用一个方法。您必须序列化数据才能传递数组。
  • 可以使用 TempData 方法发送对象列表,并且它现在正在工作,所以......是的,我可以。
  • 是的,使用 tempdata 是可能的,而不是像您在问题中尝试的那样通过路由值..

标签: methods controller asp.net-mvc-5 model-binding


【解决方案1】:

答案是使用名为“TempData”的功能,这样您就可以将任何集合(以及对象)传递给另一个控制器方法。

对我的代码的更改如下所示,从前面提到的 post 方法的底部开始。

    for (int i = 0; i < questionsToUse.Count; i++)
        {
            questionIds[i] = questionsToUse[i].QuestionId;
        }
        TempData["quizquestionids"] = questionIds;
        return RedirectToAction("ShowQuiz");
    }

我只是将我的数组传递到临时数据中,并给它一个我自己选择的名称。

然后我从我想使用它的方法中提取集合并做我需要的任何事情。

    [HttpGet]
    public ActionResult ShowQuiz()
    {
        var caseToShow = new Medcase();
        caseToShow.Title = "Quiz";
        var questionIds = TempData["quizquestionids"] as int[];

解决问题的方法相当简单且有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-10
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多