
[英]In ASP.NET MVC2 is there a way of returning a redirectToAction while passing a parameter?
[英]ASP.NET MVC RedirectToAction Passing Wrong Parameter Value?
我正在使用ASP.NET MVC 1.0。 我有一个ActionResult,它从下拉列表中接收一个带有值的表单帖子。 然后它重定向到ActionResult,将值作为参数传递。 这是我的2个ActionResult方法:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult FindPromo()
{
var promoId = Convert.ToInt32(Request.Form["ddlPromotion"]);
return RedirectToAction("GetPromo", new { id= promoId });
}
public ActionResult GetPromo(int id)
{
if (promoId > 0)
{
var model = GetModel(id);
if (model.Promo != null)
{
return View("Promo", GetModel(id));
}
}
return RedirectToAction("NotFound");
}
当我调试它时,从我的表单中正确地提取下拉列表中的值,但是在重定向上,与先前请求不同的值作为GetPromo方法上的promoId值。 即使II完全关闭页面并重新加载它,几乎就像它被缓存在某个地方一样。 我知道这很简单,但我以前从未碰过这个。
编辑:
我将参数名称从promoId更改为id,并更新了我的路由表。 我已经更新了上面的代码示例,这是我的路线:
routes.MapRoute("GetPromo", "{controller}/GetPromo/{id}",
new { controller = "Promo", action = "GetPromo" });
routes.MapRoute("FindPromo", "{controller}/FindPromo/{id}",
new { controller = "Promo", action = "FindPromo" });
然而,我仍然使用参数得到相同的结果。
您是否尝试过使用默认路由设置:{controller} / {action} / {id}? 那些是你唯一的路线吗? 路由按顺序进行评估,因此如果匹配,则先前路由可以覆盖下面的路径。 Phil Haack在他的博客haacked.com上发布了一个路由调试器
您还可以使用:RouteTable.Routes.GetVirtualPath(),传递ViewContext.RequestContext和RouteValueDictionary,并查看生成的Url。
我想知道它是否与您的路由设置有关。 尝试将promoId
重命名为id
并更新路由值。 如果这不起作用,您可以使用您的路线更新您的帖子。
你试过这个吗?
return RedirectToAction("GetPromo", new { id = promoId.ToString() });
我认为我们遇到了类似的问题并解决了这个问题。
如果没有,你可以这样做:
var dict = new RouteValueDictionary();
dict.Add("id", promoId);
return RedirectToAction("GetPromo", dict);
作为建议,您不应该使用Convert.ToInt32,而是使用int.Parse或int.TryParse。
检查您的IOC容器是否未将控制器注册为单件。 我正在使用Windsor,默认的生活方式类型是单身,这导致了“缓存”行为。 请参阅: ASP.NET MVC - 未从表单收集控制器参数?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.