Методы действий и их параметры

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

Методы действий (action methods) представляют такие методы контроллера, которые обрабатывают запросы по определенному URL. Например, возьмем проект из предыдущей главы. В нем был определен следующий контроллер:

public class HomeController : Controller
{
    BookContext db = new BookContext();

    public ActionResult Index()
    {
        IEnumerable<Book> books = db.Books;
        ViewBag.Books = books;
        return View();
    }

    [HttpGet]
    public ActionResult Buy(int id)
    {
        ViewBag.BookId = id;
        return View();
    }
    [HttpPost]
    public string Buy(Purchase purchase)
    {
        purchase.Date = DateTime.Now;
        db.Purchases.Add(purchase);
        db.SaveChanges();
        return "Спасибо, " + purchase.Person + ", за покупку!";
    }
}

Здесь методы Index и Buy являются методами действий или просто действиями контроллера. При получении запроса типа /Home/Index контроллер передает обработку запроса действию Index.

Так как запросы бывают разных типов, например, GET и POST, фреймворк ASP.NET MVC позволяет определить тип обрабатываемого запроса для действия, применив к нему соответствующий атрибут: [HttpGet], [HttpPost], [HttpDelete] или [HttpPut]. Так, действие Buy разбито на два метода, по одному для каждого типа запроса.

Однако не все методы контроллера являются методами действий. Методы действий всегда имеют модификатор public. Закрытых приватных методов действий не бывает. Но контроллер может также включать и обычные методы, которые могут использоваться в вспомогательных целях. Например,

[HttpPost]
public string Buy(Purchase purchase)
{
    purchase.Date = getToday();
    db.Purchases.Add(purchase);
    db.SaveChanges();
    return "Спасибо, " + purchase.Person + ", за покупку!";
}
private DateTime getToday()
{
    return DateTime.Now;
}

Соответственно мы не можем отправить из браузера запрос Home/getToday/, потому что метод getToday не является методом действия.

Передача данных в контроллеры и параметры

В приложении из предыдущей главы метод Buy использовал параметр purchase. Так как данный метод обрабатывает POST-запросы, то мы можем отправить ему следующую форму:

<form method="post" action="">
    <input type="hidden" value="@ViewBag.BookId" name="BookId" />
    <p>Введите свое имя </p>
    <input type="text" name="Person" />
    <p>Введите адрес :</p>
    <input type="text" name="Address" />
    <input type="submit" value="Отправить" />
</form>

Значение атрибута name у всех полей на этой форме соответствует названию свойства модели, поэтому система автоматически свяжет значения полей с соответствующими свойствами. А в методе Buy весь этот набор свойств превратится в модель Purchase.

Кроме POST-запросов у нас есть также GET-запросы, при которых все параметры передаются в строке запроса. Например, вторая версия метода Buy в качестве параметра принимает значение типа int: public ActionResult Buy(int id). Стандартный get-запрос принимает примерно следующую форму: название_ресурса?параметр1=значение1&параметр2=значение2. То есть запрос к данному методу мог бы выглядеть так: Home/Buy?id=2. Название параметров метода должно совпадать с названием параметров в строке запроса. Благодаря этому система сможет их автоматически связать. А в самом методе мы сможем получить этот параметр и использовать его по своему усмотрению.

Кроме того, система маршрутизации позволяет создавать маршруты. Например, по умолчанию в проекте MVC определяется следующий маршрут: Контроллер/Метод/id. Последний параметр является опциональным. И благодаря этому мы можем передать параметр id и так: Home/Buy/2

Для примера определим действие, которое будет подсчитывать площадь треугольника:

public string Square(int a, int h)
{
    double s = a*h/2.0;
    return "<h2>Площадь треугольника с основанием " + a + 
			" и высотой " + h + " равна " + s + "</h2>";
}

В этом случае мы можем обратиться к действию, набрав в адресной строке Home/Square?a=10&h=3, и приложение выдало бы нам нужный результат.

Мы также можем задать для параметров значения по умолчанию:

public string Square(int a=10, int h=3)
{
    double s = a*h/2.0;
    return "<h2>Площадь треугольника с основанием " + a + 
			" и высотой " + h + " равна " + s + "</h2>";
}

В этом случае при запросе страницы мы можем указать только один параметр или вообще не указывать(Home/Square?h=5).

Получение данных из контекста запроса

Кроме того, мы можем получить параметры, да и не только параметры, но и другие данные, связанные с запросом, из объектов контекста запроса. Нам доступны следующие объекты контекста: Request, Response, RoutedData, HttpContext и Server.

Объект Request содержит коллекцию Params, которая хранит все параметры, переданные в запросы. И мы их можем получить:

public string Square()
{
    int a = Int32.Parse(Request.Params["a"]);
    int h = Int32.Parse(Request.Params["h"]);
    double s = a*h/2.0;
    return "<h2>Площадь треугольника с основанием " + a + " и высотой " + h + " равна " + s + "</h2>";
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850