为什么MVC区域路由不能按预期工作?

时间:2017-10-25 10:00:33

标签: c# asp.net-mvc model-view-controller asp.net-mvc-areas areas

我在我的网站上设置了以下区域。

public class AdminAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Admin";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "AdminDefaultNoAction",
            "Admin/{controller}/{id}",
            new { action = "Home", id = UrlParameter.Optional }, new[] { "DevTest.Areas.Admin.Controllers" }
        );

        context.MapRoute(
            "AdminDefault",
            "Admin/{controller}/{action}/{id}",
            new { action = "Home", id = UrlParameter.Optional }, new[] { "DevTest.Areas.Admin.Controllers" }
        );
    }
}

以及控制器中的以下方法。

public class PlayerController : Controller
{
    public PlayerController()
    {

    }

    [HttpGet]
    public ActionResult Home(Guid id)
    {
        var model = new HomeViewModel();
        // Do Stuff
        return View("Home", model);
    }

    [HttpPost]
    public ActionResult Home(HomeViewModel model)
    {
        // Do Stuff
        return View("Home", model);
    }

    public ActionResult TestMethod(Guid id)
    {
        return Json(new
        {
            Test = "Hi!",
            id = id.ToString()
        });
    }
}

我的两个家庭方法工作正常。如果我使用 Admin / Player / TestMethod / e0ef4ab3-3fe5-4ea8-8ae1-c16b9defcabe "它可以使用TestMethod。但如果我用 Admin / Player / TestMethod命中它会失败?id = e0ef4ab3-3fe5-4ea8-8ae1-c16b9defcabe

这显然只是一个示范性的例子。我希望能够在此Controller中传递一些方法(通常是通过ajax请求),但路由不能按预期工作。

提前致谢。

1 个答案:

答案 0 :(得分:0)

@Stephen Muecke在评论中指出,我的第一条路线不够具体。我不得不限制id为它按照预期工作的指导。

我用正则表达式做了这个,因为我还在使用Mvc版本4.

context.MapRoute(
    "AdminDefaultNoAction",
    "Admin/{controller}/{id}",
    new { action = "Home", id = UrlParameter.Optional },
    new { id = @"[a-f0-9-]+" },
    new[] { "DevTest.Areas.Admin.Controllers" }
);

如果我有Mvc 5我可以使用:

new { guid = new GuidRouteConstraint() }