ASP.NET MVC - 使用RedirectToAction传递当前的GET参数

时间:2011-06-01 15:27:23

标签: asp.net-mvc redirect redirecttoaction

我正在寻找一种在传递当前请求的GET参数时使用RedirectToAction的方法。

所以去: http://mydomain.com/MyController/MyRedirectAction?somevalue=1234

然后我想重定向并使用重定向保留somevalue,而不必显式构建路由字典并明确设置somevalue

public ActionResult MyRedirectAction()
{
    if (SomeCondition) 
        RedirectToAction("MyAction", "Home");
}

重定向的操作可以使用somevalue(如果可用):

public ActionResult MyAction()
{
    string someValue = Request.QueryString["somevalue"];
}

有干净的方法吗?

2 个答案:

答案 0 :(得分:2)

如果您使用RedirectToRoute传递参数,它们将在网址中显示为查询字符串。

我不是ASP .NET MVC框架的专家,但实现此目的的一种方法是将您的数据放入TempData字典。

TempData["your key"] = someData;

您要重定向的操作应该知道检查此数据,当然还要处理它不存在的情况。该数据不会超出重定向 - 它只适用于一个请求。

如果您不喜欢使用字符串文字作为键,则可以为TempData键创建常量。

答案 1 :(得分:2)

自定义操作结果可以完成这项工作:

public class MyRedirectResult : ActionResult
{
    private readonly string _actionName;
    private readonly string _controllerName;
    private readonly RouteValueDictionary _routeValues;

    public MyRedirectResult(string actionName, string controllerName, RouteValueDictionary routeValues)
    {
        _actionName = actionName;
        _controllerName = controllerName;
        _routeValues = routeValues;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        var requestUrl = context.HttpContext.Request.Url;
        var url = UrlHelper.GenerateUrl(
            "", 
            _actionName, 
            _controllerName, 
            requestUrl.Scheme,
            requestUrl.Host,
            null,
            _routeValues, 
            RouteTable.Routes, 
            context.RequestContext, 
            false
        );
        var builder = new UriBuilder(url);
        builder.Query = HttpUtility.ParseQueryString(requestUrl.Query).ToString();
        context.HttpContext.Response.Redirect(builder.ToString(), false);
    }
}

然后:

public ActionResult MyRedirectAction()
{
    return new MyRedirectResult("MyAction", "Home", null);
}