05-特性路由

特性路由使用一组特性标注直接将Action映射到路由模板。

下面我们把Configure里面的所有路由都去掉。

如果没了路由 我们就没法找到对应的处理action了。

这个时候我们可以使用[Route]标注来指定对应的url规则

去掉默认路由后

app.UseMvc();Code language: CSS (css)

然后单独给action添加特性路由

[Route("")]
[Route("home")]
[Route("home/index")]
public IActionResult Index()
{
    return View();
}

[Route("home/abc")]
public IActionResult About()
{
    ViewData["Message"] = "Your application description page.";

    return View();
}Code language: PHP (php)

这个时候 还是可以访问得了的

另外 如果冲突了 会怎么样

比如我们给course控制器的index也添加这样的特性标注

public class CourseController : Controller
{
    [Route("")]
    [Route("home")]
    [Route("home/index")]
    public IActionResult Index()
    {
        return View();
    }

这个时候 就会报错了

An unhandled exception occurred while processing the request.

AmbiguousActionException: Multiple actions matched. The following actions matched route data and had all constraints satisfied:

FirstCoreMVC.Controllers.CourseController.Index (FirstCoreMVC)

FirstCoreMVC.Controllers.HomeController.Index (FirstCoreMVC)

这个时候 可以使用[HttpPost]和[HttpGet来进行约束]

比如下面的代码是会报错的

[Route("home/abc")]
public IActionResult About()
{
    ViewData["Message"] = "Your application description page.";

    return View();
}

[Route("home/abc")]
public IActionResult Contact()
{
    ViewData["Message"] = "Your contact page.";

    return View();
}Code language: PHP (php)

但是改为这样

[HttpGet("home/abc")]
public IActionResult About()
{
    ViewData["Message"] = "Your application description page.";

    return View();
}

[HttpPost("home/abc")]
public IActionResult Contact()
{
    ViewData["Message"] = "Your contact page.";

    return View();
}Code language: PHP (php)

如果带有参数的话 可以

[HttpGet("home/abc/{id}")]
public IActionResult About(int id)
{
    ViewData["Message"] = "Your application description page.";

    return View();
}Code language: PHP (php)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注