Результаты действий это то, что возвращает контроллер по запросу. Это может быть и строка и объект. Рассмотрим несколько примеров. Как правило возвращается либо ActionResult либо производный от него класс.
Определение своего класса
Нужно создать наследника от ActionResult и реализовать его метод.
1 2 3 4 |
public abstract class ActionResult { public abstract void ExecuteResult(ControllerContext context); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
using System.Web.Mvc; namespace BookStore.Util { public class HtmlResult : ActionResult { private string htmlCode; public HtmlResult(string html) { htmlCode = html; } public override void ExecuteResult(ControllerContext context) { string fullHtmlCode = "<!DOCTYPE html><html><head>"; fullHtmlCode += "<title>Главная страница</title>"; fullHtmlCode += "<meta charset=utf-8 />"; fullHtmlCode += "</head> <body>"; fullHtmlCode += htmlCode; fullHtmlCode += "</body></html>"; context.HttpContext.Response.Write(fullHtmlCode); } } } |
Использовать его можно таким образом
1 2 3 4 |
public ActionResult GetHtml() { return new HtmlResult("<h2>Привет мир!</h2>"); } |
Встроенные классы, производные от ActionResult
ContentResult: пишет указанный контент напрямую в ответ в виде строки, практически как предыдущие примеры
Предыдущий пример
1 2 3 4 5 6 |
public string Square(int a, int h) { int s = a*h/2; return "<h2>Площадь треугольника с основанием " + a + " и высотой " + h + " равна " + s + "</h2>"; } |
Можно переписать вот так
1 2 3 4 5 6 |
public ContentResult Square(int a, int h) { int s = a*h/2; return Content("<h2>Площадь треугольника с основанием " + a + " и высотой " + h + " равна " + s + "</h2>"); } |
Даже если мы оставим в качестве возвращаемого результата тип string, то фреймворк увидит, что возвращаемый тип не является объектом ActionResult. И тогда автоматически создается объект ContentResult для возвращаемой строки.
- EmptyResult: по сути ничего не делает, отправляет пустой ответ
- FileResult: является базовым классом для всех объектов, пишущих бинарный ответ в выходной поток. Предназначен для отправки файлов
- FileContentResult: класс, производный от
FileResult
, пишет в ответ массив байтов - FilePathResult: также производный от
FileResult
класс, пишет в ответ файл, находящийся по заданному пути - FileStreamResult: класс, производный от
FileResult
, пишет бинарный поток в выходной ответ - HttpStatusCodeResult: результат действия, который возвращает клиенту определенный статусный код HTTP
- HttpUnauthorizedResult: класс, производный от
HttpStatusCodeResult
. Возвращает клиенту ответ в виде статусного кода HTTP 401, указывая, что пользователь не прошел авторизацию и не имеет прав доступа к запрошенному ресурсу. - HttpNotFoundResult: производный от
HttpStatusCodeResult
. Возвращает клиенту ответ в виде статусного кода HTTP 404, указывая, что запрошенный ресурс не найден - JavaScriptResult: возвращает в ответ в качестве содержимого код JavaScript
- JsonResult: возвращает в качестве ответа объект или набор объектов в формате JSON
- PartialViewResult: производит рендеринг частичного представления в выходной поток
- RedirectResult: перенаправляет пользователя по другому адресу URL, возвращая статусный код 302 для временной переадресации или код 301 для постоянной переадресации зависимости от того, установлен ли флаг
Permanent
. - RedirectToRouteResult: класс работает подобно
RedirectResult
, но перенаправляет пользователя по определенному адресу URL, указанному через параметры маршрута - ViewResult: производит рендеринг представления и отправляет результаты рендеринга в виде html-страницы клиенту
Представление ViewResult
Оно возвращается довольно часто, рассмотрим его отдельно.
Как правило в контроллере пишется что-то такое…
1 2 3 4 5 6 7 |
public class HomeController : Controller { public ActionResult Index() { return View(); } } |
При этом происходит автоматический поиск представления по пути
1 |
/Views/Имя_контроллера/Имя_представления.cshtml |
Можно также указать представление в ручную
1 2 3 4 5 6 7 |
public class HomeController : Controller { public ViewResult SomeMethod() { return View("Index"); } } |
Или так
1 2 3 4 5 6 7 |
public class HomeController : Controller { public ViewResult SomeMethod() { return View("~/Views/Some/Index.cshtml"); } } |
Передача данных из контроллера в представление
Через ViewData
1 2 3 4 5 |
public ViewResult SomeMethod() { ViewData["Head"] = "Привет мир!"; return View("SomeView"); } |
При этом в представлении эти данные можно использовать так
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>SomeView</title> </head> <body> <div> <h2>@ViewData["Head"]</h2> </div> </body> </html> |
Через ViewBag
1 2 3 4 5 |
public ViewResult SomeMethod() { ViewBag.Head = "Привет мир!"; return View("SomeView"); } |
В представлении
1 2 3 4 5 6 7 |
............................ <body> <div> <h2>@ViewBag.Head</h2> </div> </body> </html> |
FileResult
В контроллере можем написать
1 2 3 4 5 6 7 8 9 10 |
public FileResult GetFile() { // Путь к файлу string file_path = Server.MapPath("~/Files/PDFIcon.pdf"); // Тип файла - content-type string file_type="application/pdf"; // Имя файла - необязательно string file_name = "PDFIcon.pdf"; return File(file_path,file_type,file_name); } |
или
1 2 3 4 5 6 7 8 9 |
// Отправка массива байтов public FileResult GetBytes() { string path = Server.MapPath("~/Files/PDFIcon.pdf"); byte[] mas = System.IO.File.ReadAllBytes(path); string file_type = "application/pdf"; string file_name = "PDFIcon.pdf"; return File(mas, file_type, file_name); } |
или
1 2 3 4 5 6 7 8 9 10 |
// Отправка потока public FileResult GetStream() { string path = Server.MapPath("~/Files/PDFIcon.pdf"); // Объект Stream FileStream fs = new FileStream(path, FileMode.Open); string file_type = "application/pdf"; string file_name = "PDFIcon.pdf"; return File(fs, file_type, file_name); } |