我正在寻找一种在传递当前请求的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"];
}
有干净的方法吗?
答案 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);
}