为什么 MVC 区域路由没有按预期工作?
Why is MVC Area Routing not working as expected?
我在我的网站上设置了以下区域。
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 请求),但路由未按预期工作。
提前致谢。
正如@Stephen Muecke 在评论中指出的那样,我的第一条路线不够具体。我必须将 id 限制为 guid 才能按预期工作。
我用的是正则表达式,因为我仍在使用 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() }
我在我的网站上设置了以下区域。
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 请求),但路由未按预期工作。
提前致谢。
正如@Stephen Muecke 在评论中指出的那样,我的第一条路线不够具体。我必须将 id 限制为 guid 才能按预期工作。
我用的是正则表达式,因为我仍在使用 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() }