使用RedirectToAction时,routeValue会丢失引用属性

时间:2009-04-05 09:53:37

标签: asp.net-mvc

所以,如果我在第一个控制器中这样做:

  public class AController:Controller
    {
            public ActionResult ActionOne()
            {
                 MyObject myObj = new MyObject()
                 myObj.Name="Jeff Atwood";
                 myObj.Age =60;
                 myObj.Address = new Address(40,"Street");

                 return RedirectToAction("ActionTwo", "BController", myObj );

             }
    }

在第二个控制器中,myObj会出来,但地址将为空。

public class BController:Controller
        {
                public ActionResult ActionOne(MyObject obj)
                {
                     //obj.Address is null?

                 }
        }

这是预期的吗?任何方式吗?

5 个答案:

答案 0 :(得分:8)

您可以使用TempData来存储两个请求之间可用的对象。在内部,默认实现使用Session。

public class AController:Controller
{
    public ActionResult ActionOne()
    {
        MyObject myObj = new MyObject()
        myObj.Name = "Jeff Atwood";
        myObj.Age = 60;
        myObj.Address = new Address(40, "Street");
        TempData["myObj"] = myObj;
        return RedirectToAction("ActionTwo", "BController");

    }
}

public class BController:Controller
{
    public ActionResult ActionTwo()
    {
        MyObject myObj = TempData["myObj"] as MyObject;
        // test if myObj is defined. If ActionTwo is invoked directly it could be null
    }
}

答案 1 :(得分:2)

我做了一些进一步的搜索,找到了Jon Kruger的博客。 http://jonkruger.com/blog/2009/04/06/aspnet-mvc-pass-parameters-when-redirecting-from-one-action-to-another/

.net MVC框架工作不支持此功能,但人们已经添加了对mvccontrib的支持。不幸的是,我不知何故无法访问mvccontrib.org。如果这个问题解决了,你能告诉我吗?谢谢。

答案 2 :(得分:2)

我遇到了同样的问题,没有明显的解决方案。虽然TempData非常方便,但不需要全部使用它,因为它相当hackish。

我找到的最佳解决方案是传递一个新的RouteValueDictionary

  return RedirectToAction("ActionTwo", "BController", new { MyObject = myObj } );

答案 3 :(得分:1)

地址是引用类型,我认为只有“String”和值类型如int,float等可以传递,因为记住它们是从控制器内部传递字符串到另一个。

可能您可能需要实现一些序列化接口才能执行此操作(这取决于传输模式,xml,html或内部使用的传输形式)。

答案 4 :(得分:0)

我遇到了同样的问题。 TempData解决方案看起来不太好,因为它会使单元测试变得困难。这是阿卡什指出的序列化问题吗?