Omówienie kontrolera ASP.NET MVC (C#)

Autor: Stephen Walther

W tym samouczku Stephen Walther przedstawia ASP.NET kontrolerów MVC. Dowiesz się, jak tworzyć nowe kontrolery i zwracać różne typy wyników akcji.

W tym samouczku przedstawiono temat ASP.NET kontrolerów MVC, akcji kontrolera i wyników akcji. Po ukończeniu tego samouczka dowiesz się, jak kontrolery są używane do kontrolowania sposobu interakcji odwiedzających z ASP.NET witryną internetową MVC.

Informacje o kontrolerach

Kontrolery MVC są odpowiedzialne za odpowiadanie na żądania dotyczące witryny internetowej MVC ASP.NET. Każde żądanie przeglądarki jest mapowane na określony kontroler. Załóżmy na przykład, że wprowadzasz następujący adres URL na pasku adresu przeglądarki:

http://localhost/Product/Index/3

W tym przypadku jest wywoływany kontroler o nazwie ProductController. ProductController jest odpowiedzialny za generowanie odpowiedzi na żądanie przeglądarki. Na przykład kontroler może zwrócić określony widok z powrotem do przeglądarki lub kontroler może przekierować użytkownika do innego kontrolera.

Lista 1 zawiera prosty kontroler o nazwie ProductController.

Listing1 — Controllers\ProductController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;

namespace MvcApplication1.Controllers
{
    public class ProductController : Controller
    {
        //
        // GET: /Products/

        public ActionResult Index()
        {
            // Add action logic here
            return View();
        }
    }
}

Jak widać na liście 1, kontroler jest tylko klasą (klasa .NET lub C#języka Visual Basic). Kontroler jest klasą, która pochodzi z podstawowej klasy System.Web.Mvc.Controller. Ponieważ kontroler dziedziczy z tej klasy bazowej, kontroler dziedziczy kilka przydatnych metod bezpłatnie (omawiamy te metody za chwilę).

Opis akcji kontrolera

Kontroler uwidacznia akcje kontrolera. Akcja jest metodą na kontrolerze, który jest wywoływany po wprowadzeniu określonego adresu URL na pasku adresu przeglądarki. Załóżmy na przykład, że wysyłasz żądanie dla następującego adresu URL:

http://localhost/Product/Index/3

W tym przypadku metoda Index() jest wywoływana w klasie ProductController. Metoda Index() jest przykładem akcji kontrolera.

Akcja kontrolera musi być publiczną metodą klasy kontrolera. Metody języka C# są domyślnie metodami prywatnymi. Należy pamiętać, że każda publiczna metoda dodawana do klasy kontrolera jest uwidaczniana automatycznie jako akcja kontrolera (należy zachować ostrożność, ponieważ akcja kontrolera może być wywoływana przez każdego we wszechświecie po prostu przez wpisanie odpowiedniego adresu URL na pasku adresu przeglądarki).

Istnieją pewne dodatkowe wymagania, które muszą zostać spełnione przez akcję kontrolera. Metoda używana jako akcja kontrolera nie może być przeciążona. Ponadto akcja kontrolera nie może być metodą statyczną. Poza tym można użyć tylko dowolnej metody jako akcji kontrolera.

Informacje o wynikach akcji

Akcja kontrolera zwraca wynik akcji o nazwie . Wynikiem akcji jest to, co akcja kontrolera zwraca w odpowiedzi na żądanie przeglądarki.

Platforma ASP.NET MVC obsługuje kilka typów wyników akcji, w tym:

  1. ViewResult — reprezentuje kod HTML i znaczniki.
  2. EmptyResult — nie reprezentuje wyniku.
  3. RedirectResult — reprezentuje przekierowanie do nowego adresu URL.
  4. JsonResult — reprezentuje wynik notacji obiektów JavaScript, który może być używany w aplikacji AJAX.
  5. JavaScriptResult — reprezentuje skrypt JavaScript.
  6. ContentResult — reprezentuje wynik tekstowy.
  7. FileContentResult — reprezentuje plik do pobrania (z zawartością binarną).
  8. FilePathResult — reprezentuje plik do pobrania (ze ścieżką).
  9. FileStreamResult — reprezentuje plik do pobrania (ze strumieniem plików).

Wszystkie te wyniki akcji dziedziczą po podstawowej klasie ActionResult.

W większości przypadków akcja kontrolera zwraca wartość ViewResult. Na przykład akcja kontrolera indeksu w pozycji Lista 2 zwraca wartość ViewResult.

Lista 2 — Controllers\BookController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;

namespace MvcApplication1.Controllers
{
    public class BookController : Controller
    {
        public ActionResult Index()
        {
            // Add action logic here
            return View();
        }
    }
}

Gdy akcja zwraca element ViewResult, kod HTML jest zwracany do przeglądarki. Metoda Index() w funkcji Listing 2 zwraca widok o nazwie Index do przeglądarki.

Zwróć uwagę, że akcja Indeks() na liście 2 nie zwraca elementu ViewResult(). Zamiast tego wywoływana jest metoda View() klasy bazowej Kontroler. Zwykle wynik akcji nie jest zwracany bezpośrednio. Zamiast tego należy wywołać jedną z następujących metod klasy bazowej Kontroler:

  1. View — zwraca wynik akcji ViewResult.
  2. Przekierowanie — zwraca wynik akcji RedirectResult.
  3. RedirectToAction — zwraca wynik akcji RedirectToRouteResult.
  4. RedirectToRoute — zwraca wynik akcji RedirectToRouteResult.
  5. Json — zwraca wynik akcji JsonResult.
  6. JavaScriptResult — zwraca wartość JavaScriptResult.
  7. Content — zwraca wynik akcji ContentResult.
  8. Plik — zwraca wartość FileContentResult, FilePathResult lub FileStreamResult w zależności od parametrów przekazanych do metody.

Jeśli więc chcesz zwrócić widok do przeglądarki, wywołaj metodę View(). Jeśli chcesz przekierować użytkownika z jednej akcji kontrolera do innej, wywołaj metodę RedirectToAction(). Na przykład akcja Details() w obszarze Lista 3 wyświetla widok lub przekierowuje użytkownika do akcji Index() w zależności od tego, czy parametr Id ma wartość.

Lista 3 — CustomerController.cs

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    public class CustomerController : Controller
    {
        public ActionResult Details(int? id)
        {
            if (!id.HasValue)
                return RedirectToAction("Index");

            return View();
        }

        public ActionResult Index()
        {
            return View();
        }

    }
}

Wynik akcji ContentResult jest specjalny. Możesz użyć wyniku akcji ContentResult, aby zwrócić wynik akcji jako zwykły tekst. Na przykład metoda Index() w funkcji Listing 4 zwraca komunikat jako zwykły tekst, a nie jako kod HTML.

Lista 4 — Controllers\StatusController.cs

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    public class StatusController : Controller
    {
        public ActionResult Index()
        {
            return Content("Hello World!");
        }
    }
}

Po wywołaniu akcji StatusController.Index() widok nie jest zwracany. Zamiast tego do przeglądarki jest zwracany nieprzetworzony tekst "Hello world!".

Jeśli akcja kontrolera zwraca wynik, który nie jest wynikiem akcji — na przykład datą lub liczbą całkowitą — wynik zostanie automatycznie opakowany w właściwość ContentResult. Na przykład po wywołaniu akcji Index() kontrolki WorkController na liście 5 data jest zwracana automatycznie jako właściwość ContentResult.

Lista 5 — WorkController.cs

using System;
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    public class WorkController : Controller
    {
        public DateTime Index()
        {
            return DateTime.Now;
        }
    }
}

Akcja Index() na liście 5 zwraca obiekt DateTime. Struktura ASP.NET MVC konwertuje obiekt DateTime na ciąg i automatycznie opakowuje wartość DateTime w elemecie ContentResult. Przeglądarka otrzymuje datę i godzinę jako zwykły tekst.

Podsumowanie

Celem tego samouczka było wprowadzenie do pojęć dotyczących kontrolerów MVC ASP.NET, akcji kontrolera i wyników akcji kontrolera. W pierwszej sekcji przedstawiono sposób dodawania nowych kontrolerów do projektu MVC ASP.NET. Następnie przedstawiono, jak publiczne metody kontrolera są widoczne dla wszechświata jako działania kontrolera. Na koniec omówiliśmy różne typy wyników akcji, które można zwrócić z akcji kontrolera. W szczególności omówiliśmy sposób zwracania akcji kontrolera ViewResult, RedirectToActionResult i ContentResult.