c# - RedirectToAction 生成错误的 url(查询字符串参数而不是路由数据参数)

标签 c# asp.net-mvc asp.net-mvc-5 redirecttoaction routeattribute

我在我的项目中使用 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/

相关文章:

c# - ASP.NET MVC : How to handle cross-action TempData and ViewData

c# - 路由问题 : ASP. NET 4 或 4.5

asp.net-mvc - 即使禁用 session ,ASP.NET MVC 5 并发请求也会排队

Azure Web应用程序在发布或重新启动后非常慢

c# - 使用 WCF 实现低延迟实时金融数据馈送的最佳实践?

c# - 三角网格的良好数据结构

c# - 通用抽象类继承

c# - 我如何使用验证来强制 ASP.NET MVC 2 中的属性的唯一性?

c# - 不断检查服务器是否正在使用C#监听给定的端口

c# - ASP.NET MVC 5 中的路由可选参数