. Net: Должен ли контроллер иметь имя файла, соответствующее URL? - PullRequest
0 голосов
/ 03 февраля 2020

Я следую этому уроку на. Net контроллерах и там написано "представьте, что вы вводите следующий URL в адресную строку браузера: http://localhost/Product/Index/3 В этом случае вызывается контроллер с именем ProductController. "

Что я хочу знать:

Чтобы успешно нажать http://localhost/Product/Index/3, вам нужен контроллер называется ProductController конкретно?

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

Это зависит. В ASP. Net Core маршрутизация может быть настроена как обычная маршрутизация или как атрибутная маршрутизация.

Обычная маршрутизация настроена следующим образом:

routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}"); 

Здесь первый сегмент пути отображается на имя контроллера, второй - на имя действия, третий сегмент используется для необязательного идентификатора, используемого для сопоставления с объектом модели.

Как правило, файл контроллера имя обычно совпадает с именем класса контроллера. Следовательно, в обычной маршрутизации URL будет соответствовать имени файла.

URL http://localhost/Products/Index соответствует методу действия ниже в ProductsController.

[Route("[controller]")]
public class ProductsController : Controller
{
   [HttpPost("Index")]     // Matches 'Products/Index'  
   public IActionResult Index()
    {
        return View();
    }
}

Маршрутизация атрибута

При маршрутизации атрибута имя контроллера и имена действий не играют роли в выборе действия. Следовательно, он не зависит от имени файла.

URL-адрес http://localhost/Items/All соответствует методу действия ниже в ProductsController.

public class ProductsController : Controller
{
   [Route("Items/All")]
   public IActionResult Index()
   {
      return View();
   }
}

Аналогично, атрибут [Route] может быть добавлены как в контроллере, так и в методах действия. Тот же URL-адрес http://localhost/Items/All соответствует методу действия, показанному ниже:

[Route("Items")]
public class ProductsController : Controller
    {
       [Route("All")]
       public IActionResult Index()
       {
          return View();
       }
    }

Для получения дополнительной информации см. Документы Microsoft на https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-3.1

0 голосов
/ 03 февраля 2020

Нет, это не обязательно. Вы можете использовать атрибут маршрута.

[Route("new-name-for-product")]
public class ProductController{

}

теперь вам нужно использовать http://localhost/new-name-for-product/Index/ этот URL для вызова ProductController. Если вы хотите использовать один или несколько параметров с этим URL, вы должны использовать разные шаблоны маршрутов для ActionMethod. Пример ниже.

[Route("new-name-for-product")]
public class ProductController
{

// http://localhost/new-name-for-product/3/ will show product details based on id
// http://localhost/new-name-for-product/Index/3/ will show product details based on id

[HttpGet]
[Route("/{id}")]
public IActionResult Index(int id)
{
// your code
}

// you can use a different action method name. 
// http://localhost/details/3/ will show product details based on id
// but parameter name (Ex: id) and the id inside route template the spelling must be the same.

[HttpGet]
[Route("details/{id}")]
public IActionResult GetById(int id)
{
// your code
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...