Asp.net mvc 使用RedirectToAction时,routeValue会丢失引用属性

Asp.net mvc 使用RedirectToAction时,routeValue会丢失引用属性,asp.net-mvc,Asp.net Mvc,因此,如果我在第一个控制器中执行此操作: public class AController:Controller { public ActionResult ActionOne() { MyObject myObj = new MyObject() myObj.Name="Jeff Atwood"; myObj.Age =60;

因此,如果我在第一个控制器中执行此操作:

  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将显示为ok,但地址将为null

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

                 }
        }

这和预期的一样吗?不管怎么说?

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

您可能需要实现一些序列化接口来实现这一点(这取决于传输模式、xml、html或内部使用的传输形式)。

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

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
    }
}

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

我做了进一步的搜索,找到了乔恩·克鲁格的博客。


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

我遇到了同样的问题,没有明显的解决办法。虽然TempData很方便,但不必到处使用它也很好,因为它相当粗糙

我找到的最好的解决办法是通过一本新的RouteValueDictionary

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

愚蠢的问题:MyObject是公共类吗?成员是属性还是字段?我一直使用这种方法,没有任何问题。