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是公共类吗?成员是属性还是字段?我一直使用这种方法,没有任何问题。