我开始考虑将应用程序移到MVC6上以利用新框架。我遇到的最大问题之一是路由(仅限属性路由,我已完成删除默认路由)。
我的应用程序通常设置如下:
区/管理/控制器 地区/客户/控制器 /控制器< - 非区域项目
在每个区域中,我都有一个基本控制器(如AdminBase,CustomerBase),它将包含带有“AreaPrefix”的[Area]标签,该区域中的每个控制器将继承它并指定[RoutePrefix]。
如果我想在路径中包含区域/控制器,每个ActionResult必须包含[Route(“[area] / [controller] / [action]”)]来产生输出,那么问题就出现了,但是,如果,例如,我有一个“ChangeAddress”控制器,我会在URL中将其作为“更改地址”的前缀,但我看不出办法,没有明确地将它放在控制器中的所有路径上如何实现这一点?
答案 0 :(得分:8)
在MVC6中,你仍然有区域和前缀,它只是被降级为控制器级别的Route标签,并将动作路由放入http动词。那就是。
这样:
[RouteArea("AreaPrefix")]
[RoutePrefix("RoutePrefix")]
public class HomeController : Controller
{
...
[HttpGet]
[Route("LoginAction")]
public ActionResult Login() ....
变为
[Route("AreaPrefix/ControllerPrefix")]
public class HomeController : Controller
{
...
[HttpGet("LoginAction")]
public IActionResult Login() {
所以它更模糊,但我个人一直是自我牺牲路由过程的罪魁祸首,并且它使用[]表示法中的标准路由对象(将其视为之前的{})。但它仍然提供了一次指定分层的控制级别,因此它现在提供了一个更简单的继承模型:
[Route("AreaPrefix/ControllerPrefix")
public class HomeOps : Controller // Controller Suffix is optional
{
}
[Route("api")]
public class HomeApiOps : HomeOps
{
// put the api AJAX methods here
[HttpPost("lookup")] // will route to // AreaPrefix/ControllerPrefix/api/lookup
public IActionResult Lookup() {
}
public class HomePageOps : HomeOps
{
// put similar routes for View returns, file content responses here
[HttpPost("lookup")] // Will route to AreaPrefix/ControllerPrefix/lookup
public IActionResult Lookup() {
}
这可以深入分析表达“工作单位”的更有条理的方式。和 '业务线'这些概念,你可以轻松地分组api调用和页面,而不需要庞大的控制器或无休止的#region旅行。
通过这种继承,还要记住,你可以为每个区域创建一个根控制器类,并为区域范围的分层设置某些路由,然后继承到第二层,用于" ControllerPrefix"开销路由,只需要在每个操作上指定操作路由名称,它使用继承汇总将路由粘合在一起,将前面的示例转换为AreaPrefix / ControllerPrefix / Route
我和你一起使用MVC6,我的业务客户端开发人员喜欢这个平台,而在数据端,它使得他们的信息干净简单,但稀疏的文档会令人沮丧有时...希望这有帮助