Why this matters
Starting a route template with '/' in ASP.NET makes it absolute, ignoring controller-level routes and potentially breaking expected routing behavior.
Starting a route template with '/' in ASP.NET makes it absolute, ignoring controller-level routes and potentially breaking expected routing behavior.
Starting a route template with '/' in ASP.NET makes it absolute, ignoring controller-level routes and potentially breaking expected routing behavior.
Side-by-side examples engineers can pattern-match during review.
[Route("[controller]")] // This route is ignored
public class ReviewsController : Controller // Noncompliant
{
// Route is /reviews
[HttpGet("/reviews")]
public ActionResult Index() { /* ... */ }
// Route is /reviews/{reviewId}
[Route("/reviews/{reviewId}")]
public ActionResult Show(int reviewId)() { /* ... */ }
}[Route("/")] // Turns on attribute routing
public class ReviewsController : Controller
{
// Route is /reviews
[HttpGet("reviews")]
public ActionResult Index() { /* ... */ }
// Route is /reviews/{reviewId}
[Route("reviews/{reviewId}")]
public ActionResult Show(int reviewId)() { /* ... */ }
}[Route("[controller]")] // This route is ignored
public class ReviewsController : Controller // Noncompliant
{
// Route is /reviews
[HttpGet("/reviews")]
public ActionResult Index() { /* ... */ }
// Route is /reviews/{reviewId}
[Route("/reviews/{reviewId}")]
public ActionResult Show(int reviewId)() { /* ... */ }
}[Route("/")] // Turns on attribute routing
public class ReviewsController : Controller
{
// Route is /reviews
[HttpGet("reviews")]
public ActionResult Index() { /* ... */ }
// Route is /reviews/{reviewId}
[Route("reviews/{reviewId}")]
public ActionResult Show(int reviewId)() { /* ... */ }
}From the same buckets as this rule.