最近项目需要涉及到跳转保存查询条件的问题,于是发现利用简单RedirectToAction(string ActionName) 无法传递参数给重定向的Action,于是查看了ASP.NET MVC的源码(项目用的 ASP.NET MVC Preview3)发现Controller中RedirectToAction方法声明源码如下:
protected internal RedirectToRouteResult RedirectToAction( string actionName) { return RedirectToAction(actionName, (RouteValueDictionary) null ); } protected internal RedirectToRouteResult RedirectToAction( string actionName, object values) { return RedirectToAction(actionName, new RouteValueDictionary(values)); } protected internal RedirectToRouteResult RedirectToAction( string actionName, RouteValueDictionary values) { return RedirectToAction(actionName, null /* controllerName */ , values); } |
项目中也使用了RedirectToAction的方法传递值的,一般都是这么使用的:
return RedirectToAction( "Index" , new {id=1;username= "mikel" }); |
于是想知道上面的方法调用的是 RedirectToAction(string actionName, object values) 还是 RedirectToAction(string actionName, RouteValueDictionary values),设置断点单步调试了下,发现调用的是 RedirectToAction(string actionName, object values),而且values中是以key=value的格式存储的数据并调用RedirectToAction(string actionName, RouteValueDictionary values)执行,那么看来最终执行跳转的是RedirectToAction(actionName, null /* controllerName */, values);这个方法:
protected internal virtual RedirectToRouteResult RedirectToAction( string actionName, string controllerName, RouteValueDictionary values) { if (String.IsNullOrEmpty(actionName)) { throw new ArgumentException(MvcResources.Common_NullOrEmpty, "actionName" ); } RouteValueDictionary newDict = (values != null ) ? new RouteValueDictionary(values) : new RouteValueDictionary(); newDict[ "action" ] = actionName; if (!String.IsNullOrEmpty(controllerName)) { newDict[ "controller" ] = controllerName; } return new RedirectToRouteResult(newDict); } |
于是想到既然传递的是new{key=value}的对象,那就是个类的实例啊,正好项目中用的都是实体类传递条件的,那直接将实体类的对象传递给方法进行重定向就行了,具体代码如下:
public class Test { public string id{ get ; set ;} public string condition{ get ; set ;} } public class HomeController : Controller { [CachedFilter] public ActionResult Index( string id) { ViewData[ "Title" ] = "Home Page" ; ViewData[ "Message" ] = "Welcome to ASP.NET MVC!" ; return View(); } public ActionResult About() { ViewData[ "Title" ] = "About Page" ; Test t = new Test(); t.id = "none" ; t.condition = "n" ; return RedirectToAction( "Index" , t); } } |
这样就是实现了条件值的重定向传递,看来很多事需要认真阅读源码才能知道