我在我的项目中使用 RouteAttributes,它们工作正常,但在这种情况下除外: 我有两个类似的操作,一个接受两个 int 参数,另一个只接受一个。
第一个接受两个参数并使用它们加载一个对象并将其传递给 View ; 第二个只是尝试找到第二个变量的默认值,并重定向到第一个操作,传递两个变量。
问题是在 ActionResultExample(int idVar1)
中,我希望被重定向到 ControllerExample/Edit/idVar1/Brands/idVar2
;但是我被重定向到 ControllerExample/Edit/idVar1/Brands?idVar2=idVar2
。
当然,这会产生无限的重定向循环。
这里是示例代码:
[Route("ControllerExample/Edit/{idVar1}/Brands/{idVar2}")]
public ActionResult ActionResultExample(int idVar1, int idVar2)
{
var objectForView= ObjectController.Get(idVar1, idVar2);
return View("ActionResultExample", objectForView);
}
[Route("ControllerExample/Edit/{idVar1}/Brands")]
public ActionResult ActionResultExample(int idVar1)
{
...
var idVar2 = getDefaultVar2();
return RedirectToAction("ActionResultExample", //redirects to ControllerExample/Edit/idVar1/Brands?idVar2=idVar2 instead of ControllerExample/Edit/idVar1/Brands/idVar2
new {idVar1= idVar1, idVar2 = idVar2 });
}
最佳答案
您可以使用 1 个路由和 1 个操作方法来完成此操作:
在这里,我们使用 ?表示最后一个 URL 参数是可选的,我们使用默认方法参数在操作方法中执行相同的操作。
[Route("ControllerExample/Edit/{idVar1}/Brands/{idVar2?}")]
public ActionResult ActionResultExample(int idVar1, int? idVar2 = null)
{
var idVar2Int = !idVar2.HasValue ? getDefaultVar2() : idVar2.Value;
var objectForView= ObjectController.Get(idVar1, idVar2Int);
return View("ActionResultExample", objectForView);
}
如果您确实希望将其作为 2 个单独的操作方法,则可能需要升级到 System.Web.Mvc 5.1(可以通过 nuget 完成)。然后,您可以使用 RouteAttribute 上的 Order 参数。但是,您还应该rename at least one of the action methods because in MVC, you should not have 2 GET overloads with the same name :
[Route("ControllerExample/Edit/{idVar1}/Brands/{idVar2}", Order = 1)]
public ActionResult ActionResultExample(int idVar1, int idVar2)
{
var objectForView= ObjectController.Get(idVar1, idVar2);
return View("ActionResultExample", objectForView);
}
[Route("ControllerExample/Edit/{idVar1}/Brands", Order = 2)]
public ActionResult ActionResultExampleWithoutDefaults(int idVar1)
{
...
var idVar2 = getDefaultVar2();
return RedirectToAction("ActionResultExample", //redirects to ControllerExample/Edit/idVar1/Brands?idVar2=idVar2 instead of ControllerExample/Edit/idVar1/Brands/idVar2
new {idVar1= idVar1, idVar2 = idVar2 });
}
关于c# - RedirectToAction 生成错误的 url(查询字符串参数而不是路由数据参数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21780288/