【问题标题】:Why is MVC Area Routing not working as expected?为什么 MVC 区域路由没有按预期工作?
【发布时间】:2018-04-06 08:48:57
【问题描述】:

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

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.

这显然只是一个示范性的例子。我希望能够在这个控制器中使用一些方法来传递值(主要是通过 ajax 请求),但是路由没有按预期工作。

提前致谢。

【问题讨论】:

  • 尝试将 web.config 文件中的 maxQueryString 参数设置为更大的限制或去掉它,请参阅此类似问题:stackoverflow.com/questions/16605632/…。
  • 你的路线没有意义。第一个匹配任何带有Admin的url,后跟一个或2个段,所以Admin/Player/TestMethod?id=e0ef4ab3-3fe5-4ea8-8ae1-c16b9defcabe匹配它并转到PlayerController的Home()方法并将“TestMethod”传递给id参数
  • 只需删除您的第一条路线(不清楚其用途)或向{id} 段添加约束以确保其为Guid
  • @Stephen Muecke 正如你所说,我删除了第一条路线,这确实解决了这个问题。但是,我现在无法执行“Admin/Player/[guid]”之类的请求并将其路由到我指定的默认操作。如何设置我的区域路线配置以实现两者? TIA
  • 您可以添加路由约束(这样,如果它不是 Guid 则它与 AdminDefaultNoAction 路由不匹配并落入 AdminDefault 路由

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


【解决方案1】:

正如@Stephen Muecke 在 cmets 中所指出的,我的第一条路线不够具体。我必须将 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() }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 2021-01-03
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多