int是null但TempData不是?

时间:2013-05-16 06:05:25

标签: c# asp.net-mvc tempdata

我需要在两个动作结果之间传递一些数据,所以我想我会尝试TempData(我对MVC很新,所以请耐心等待)。这就是我尝试过的:

public ActionResult Edit(Companies companies, HttpPostedFileBase file)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    if (file != null)
                    {
                        //Do stuff with file, save changes to database etc.

                        TempData["Companies"] = companies;

                        return RedirectToAction("bgcTest2", "Companies");

现在存储临时数据。并检索它:

public ActionResult bgcTest2(string BolagsID, Companies companies)
        {
            try
            {
                companies = TempData["Companies"] as Companies;
                int test = companies.BolagsID;

现在问题在于此; companies.BolagsID有一个值,但test始终为null。为什么?我该如何解决?

修改

我注意到了一件很奇怪的事情;当尝试Darin Dimitrovs的建议时,也许在我尝试的时候,如果我只在返回空值的行上放置一个断点,它就不会破坏直到后面的行。好像该行被注释掉并且根本不执行。欢迎来到暮光之城。

EDIT2:

拿2:

[HttpPost]
        public ActionResult Edit(Companies companies, HttpPostedFileBase file)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    if (file != null)
                    {
                        // non related stuff

                        return RedirectToAction("bgcTest2", "Companies", new {BolagsID = companies.BolagsID});

[Authorize]
        public ActionResult bgcTest2(int BolagsID)
        {
            try
            {
                int test = BolagsID;

我仍然得到“当前上下文中不存在测试”。

EDIT3:

2件作品很好。声明后我的变量是null,因为我从未在任何地方使用它们。我想我一步一步,但显然,在某些情况下,你必须采取几个步骤才能看到它们中的任何一个。

获得的经验:确保使用声明的变量,否则它们将是null

1 个答案:

答案 0 :(得分:2)

我建议您不要使用TempData,因为它依赖于Session。如果只需要BolagsID,那么只需将其作为参数传递:

public ActionResult Edit(Companies companies, HttpPostedFileBase file)
{
    if (ModelState.IsValid)
    {
        try
        {
            if (file != null)
            {
                //Do stuff with file, save changes to database etc.
                return RedirectToAction("bgcTest2", "Companies", new { BolagsID = companies.BolagsID });

然后:

public ActionResult bgcTest2(int bolagsID)
{
    ... use the bolagsID here directly
}

不幸的是,您无法使用此方法传递复杂对象。但是您可以将此对象保留在数据存储区中,并仅将id传递给目标控制器操作,以允许您在重定向后从此数据存储区中检索它。