在不同区域具有相同名称的控制器

时间:2019-05-17 19:13:18

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

返回的是名称相同的ambiguos控制器 我尝试了一些代码,作为routeAttribute [Route]和[Area],但没有成功。 我正在使用Asp.net Core MVC-C#

structured

case 1:
redirection = RedirectToAction("Index", "Home", new { area = "first" }); ;
break;
case 2:
redirection = RedirectToAction("Index", "Home", new { area = "second" });
break;

我的路线:

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Login}/{action=Index}/{id?}");
        });

        app.UseMvc(routes =>
        {
            routes.MapRoute(
              name: "areas",
              template: "{area:exists}/{controller=Admin}/{action=Index}/{id?}"
           );

            //routes.MapRoute("areaRoute", "{area:exists}/{controller=Admin}/{action=Index}/{id?}");
            //routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}");

        });

[Microsoft.AspNetCore.Authorization.AllowAnonymous]
    [Area("first")]
    public class HomeController : Controller
    {
        [Route("first")]

        public IActionResult Index()
        {
            return View();
        }

        public IActionResult Logout()
        {
            return RedirectToAction("Logout", "Login");
        }

    }

2 个答案:

答案 0 :(得分:1)

将您的路线定义合并为一个UseMvc调用,并且始终将默认路线排在最后,顺序很重要。

app.UseMvc(routes =>
{
  routes.MapRoute(
    name: "areas",
    template: "{area:exists}/{controller=Admin}/{action=Index}/{id?}"
  );

  routes.MapRoute(
    name: "default",
    template: "{controller=Login}/{action=Index}/{id?}");
  });
});

尝试一下,看看它是否为您固定了路线。除此之外,我没有看到任何其他与您的代码有关的超级明显问题,但是如果将区域称为“第一”,我将避免将您的路由称为“第一”。我觉得那只会使事情变得混乱。

不过可能想为您的控制器清理“默认”值。

我知道您想要的是可能的,我在代码中做了很多次。如果仍然无法解决,请通知我们。

答案 1 :(得分:0)

这项工作可以吗?

case 1:
    redirection = Area.first.Controllers.HomeController.RedirectToAction("Index", "Home", new { area = "first" }); ;
    break;
case 2:
    redirection = Area.second.Controllers.HomeController.RedirectToAction("Index", "Home", new { area = "second" });
    break;