索引的RedirectToAction转到example.com/controller/id

时间:2017-05-01 18:11:03

标签: c# asp.net-mvc asp.net-mvc-routing redirecttoaction

我们正在使用一个具有"索引"动作:

[Route("")]
[Route("Index/{id:int?}")]
[Route("{id:int?}")]    
public ActionResult Index(int? id)
    {
         var viewModel = new GroupViewModel();
....
        return View("Index", viewModel);

    }

我们可以使用example.com/my/example.com/my/indexexample.com/my/index/1来执行此操作。这可以按我们的意愿工作。现在我们要使用example.com/my/index/1语法重定向到此。

执行此行时:

return RedirectToAction("Index", "My", new { id = 3 });

它将使用此网址重定向:

example.com/my?id=3

我们希望它改为使用example.com/my/index/1

是否有人知道强制RedirectToAction在没有问号的情况下使用此约定的方法?

更新了5/2/17以更正以下评论的控制器名称

1 个答案:

答案 0 :(得分:1)

您需要告诉您需要使用哪个路由模板来生成重定向的URL。目前您还没有一个可以生成 / my / index / 1 的网址的网址模板"My/Index/{id:int?}"

首先,将该路由模板添加到您的操作中,并设置该路由的Name属性,如下所示:

[Route("")]
[Route("Index/{id:int?}")]
[Route("My/Index/{id:int?}", Name = "MyCompleteRouteName")]
[Route("{id:int?}")]    
public ActionResult Index(int? id)
{
     var viewModel = new GroupViewModel();
....
     return View("Index", viewModel);
}

其次,您必须RedirectToRoute而不是RedirectToActionRedirectToRoute允许您通过提供名称来选择所需的模板。

所以你必须打电话给这一行:

RedirectToRoute("MyCompleteRouteName",  new { id = 3 });

而不是

RedirectToAction("Index", "My", new { id = 3 });