MVC路由 - 多个url匹配单个控制器/方法

时间:2017-10-18 14:32:44

标签: c# .net asp.net-mvc asp.net-mvc-5

我正在尝试设置一个控制器来使用2个不同的URL。

所以我想要的是导航到:

  • mysite.com/MyArea/some-route/SomeAction
  • mysite.com/OtherArea/some-route/SomeAction

让他们两个去同一个地方。

所以我有一个这样的课程设置:

[RouteArea("MyArea", AreaPrefix = "MyArea")]
[RoutePrefix("some-route")]
[Route("{action}")]
public class MyController : Controller
{
    [Route("SomeAction")]
    [Route("~/OtherArea/some-route/SomeAction")]
    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult MyAction()
    {
        return View();
    }
}

所以这很有效 - 虽然看起来有点乱 我可以在浏览器中键入任意一个URL,然后它会选择此操作/页面。

'OtherArea'并不存在。有时候我想使用第一个网址,有时候是第二个网址。

1)如何路由到此操作并指定网址?

RedirectToAction("MyAction", "MyController", new { area = "MyArea" }); 

我只是指定控制器/动作 - 它自己找到的URL。 我可以强迫它使用其中一种吗?

理想情况下没有硬编码路径。

2)有没有更好的方法来做我想做的事情? 我不喜欢这条线:

[Route("~/OtherArea/some-route/SomeAction")]

但我也不想为了拥有第二个网址而创建一个控制器副本和一个新区域。

由于

1 个答案:

答案 0 :(得分:1)

你应该将你的逻辑放在一个方法中并在2个不同的动作中使用它

[Route("SomeAction")]    
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult MyAction1()
{
    MyMethod()
    return View("MyAction");
}


[Route("~/OtherArea/some-route/SomeAction")]
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult MyAction2()
{
    MyMethod();
    return View("MyAction");
}

private MyMethod(){
 ....
}

但是他们仍然可以共享相同的视图