[原创]ASP.NET MVC 的RedirectToAction的用法

最近项目需要涉及到跳转保存查询条件的问题,于是发现利用简单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);
    }
}

这样就是实现了条件值的重定向传递,看来很多事需要认真阅读源码才能知道

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏