Учебники

ASP.NET MVC — Селекторы

Селекторы действий — это атрибуты, которые можно применять к методам действий и которые влияют на то, какой метод действия вызывается в ответ на запрос. Это помогает механизму маршрутизации выбрать правильный метод действия для обработки определенного запроса.

Это играет очень важную роль, когда вы пишете свои методы действий. Эти селекторы будут определять поведение вызова метода на основе измененного имени, указанного перед методом действия. Обычно используется для псевдонима имени метода действия.

Существует три типа атрибутов селектора действий —

  • ActionName
  • Бездействие
  • Глаголы действия

ActionName

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

Давайте рассмотрим простой пример из последней главы, в которой у нас есть HomeController, содержащий два метода действия.

using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;

namespace MVCFiltersDemo.Controllers {
   public class HomeController : Controller{
      // GET: Home
      public string Index(){
         return "This is ASP.Net MVC Filters Tutorial";
      } 
		
      public string GetCurrentTime(){
         return DateTime.Now.ToString("T");
      }
   }
}

Давайте применим селектор ActionName для GetCurrentTime, написав [ActionName («CurrentTime»)] над GetCurrentTime (), как показано в следующем коде.

using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;

namespace MVCFiltersDemo.Controllers {
   public class HomeController : Controller{
      // GET: Home
      public string Index(){
         return "This is ASP.Net MVC Filters Tutorial";
      }
		
      [ActionName("CurrentTime")]
      public string GetCurrentTime(){
         return DateTime.Now.ToString("T");
      }
   }
}

Теперь запустите это приложение и введите следующий URL в браузере http: // localhost: 62833 / Home / CurrentTime , вы получите следующий вывод.

Localhost CurrentTime

Вы можете видеть, что мы использовали CurrentTime вместо исходного имени действия, которым является GetCurrentTime в приведенном выше URL.

Бездействие

NonAction — это еще один встроенный атрибут, который указывает, что открытый метод контроллера не является методом действия. Он используется, когда вы хотите, чтобы метод не рассматривался как метод действия.

Давайте рассмотрим простой пример, добавив еще один метод в HomeController, а также применим атрибут NonAction с помощью следующего кода.

using MVCFiltersDemo.ActionFilters;
using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;

namespace MVCFiltersDemo.Controllers {
   public class HomeController : Controller{
      // GET: Home
      public string Index(){
         return "This is ASP.Net MVC Filters Tutorial";
      }
		
      [ActionName("CurrentTime")]
      public string GetCurrentTime(){
         return TimeString();
      }
		
      [NonAction]
      public string TimeString(){
         return "Time is " + DateTime.Now.ToString("T");
      }
   }
}

Новый метод TimeString вызывается из GetCurrentTime (), но вы не можете использовать его в качестве действия в URL.

Давайте запустим это приложение и укажем следующий URL-адрес http: // localhost: 62833 / Home / CurrentTime в браузере. Вы получите следующий вывод.

Localhost Home Текущее время

Давайте теперь проверим / TimeString как действие в URL и посмотрим, что произойдет.

TimeString

Вы можете видеть, что это выдает ошибку «404 — Not Found».

Глаголы действия

Другой фильтр выбора, который вы можете применить, — это атрибуты ActionVerbs. Таким образом, это ограничивает указание конкретного действия определенными HttpVerbs. Вы можете определить два разных метода действия с одинаковым именем, но один метод действия отвечает на запрос HTTP Get, а другой метод действия отвечает на запрос HTTP Post.

MVC Framework поддерживает следующие ActionVerbs.

  • HttpGet
  • HttpPost
  • HttpPut
  • HttpDelete
  • HttpOptions
  • HttpPatch

Давайте рассмотрим простой пример, в котором мы создадим EmployeeController.

using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;

namespace MVCControllerDemo.Controllers {
   public class EmployeeController : Controller{
      // GET: Employee
      public ActionResult Search(string name = No name Entered”){
         var input = Server.HtmlEncode(name);
         return Content(input);
      }
   }
}

Теперь давайте добавим еще один метод действия с тем же именем, используя следующий код.

using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;

namespace MVCControllerDemo.Controllers {
   public class EmployeeController : Controller{
      // GET: Employee
      //public ActionResult Index()
      //{
         // return View();
      //}
		
      public ActionResult Search(string name){
         var input = Server.HtmlEncode(name);
         return Content(input);
      }
		
      public ActionResult Search(){
         var input = "Another Search action";
         return Content(input);
      }
   }
}

Когда вы запустите это приложение, оно выдаст ошибку, потому что инфраструктура MVC не может определить, какой метод действия должен быть выбран для запроса.

Позвольте нам указать HttpGet ActionVerb с действием, которое вы хотите в качестве ответа, используя следующий код.

using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;

namespace MVCControllerDemo.Controllers {
   public class EmployeeController : Controller{
      // GET: Employee
      //public ActionResult Index()
      //{
         // return View();
      //}
		
      public ActionResult Search(string name){
         var input = Server.HtmlEncode(name);
         return Content(input);
      }
		
      [HttpGet]
      public ActionResult Search(){
         var input = "Another Search action";
         return Content(input);
      }
   }
}

Когда вы запустите это приложение, вы получите следующий вывод.