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

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

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

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


person RNdev    schedule 03.02.2020    source источник
comment
чтобы понять это, вы должны понимать маршрутизацию tutorialsteacher.com/mvc/routing-in-mvc< /а>   -  person Marwen Jaffel    schedule 03.02.2020


Ответы (2)


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

[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
}
}
person S.P Sarkar    schedule 03.02.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

person Bob Ash    schedule 03.02.2020