Tworzenie aplikacji MVC 3 ze składnią Razor i dyskretnym kodem JavaScript

autor: Microsoft

Przykładowa aplikacja internetowa lista użytkowników pokazuje, jak łatwo jest utworzyć ASP.NET aplikacje MVC 3 przy użyciu aparatu widoku Razor. Przykładowa aplikacja pokazuje, jak używać nowego aparatu widoków Razor z ASP.NET MVC w wersji 3 i Visual Studio 2010, aby utworzyć fikcyjną witrynę internetową listy użytkowników, która zawiera funkcje, takie jak tworzenie, wyświetlanie, edytowanie i usuwanie użytkowników.

W tym samouczku opisano kroki, które zostały podjęte w celu utworzenia przykładowej listy użytkowników ASP.NET aplikacji MVC 3. Projekt programu Visual Studio z kodem źródłowym C# i VB jest dostępny do dołączenia do tego tematu: Pobierz. Jeśli masz pytania dotyczące tego samouczka, opublikuj je na forum MVC.

Omówienie

Aplikacja, którą utworzysz, jest prostą witryną internetową listy użytkowników. Użytkownicy mogą wprowadzać, wyświetlać i aktualizować informacje o użytkowniku.

Przykładowa witryna

Ukończony projekt VB i C# można pobrać tutaj.

Tworzenie aplikacji internetowej

Aby rozpocząć samouczek, otwórz program Visual Studio 2010 i utwórz nowy projekt przy użyciu szablonu aplikacji internetowej platformy ASP.NET MVC 3 . Nadaj aplikacji nazwę "Mvc3Razor".

Nowy projekt MVC 3

W oknie dialogowym Nowy projekt MVC 3 ASP.NET wybierz pozycję Aplikacja internetowa, wybierz aparat widoków Razor, a następnie kliknij przycisk OK.

Okno dialogowe Nowy projekt ASP.NET MVC 3

W tym samouczku nie będziesz używać dostawcy członkostwa ASP.NET, więc możesz usunąć wszystkie pliki skojarzone z logowaniem i członkostwem. W Eksplorator rozwiązań usuń następujące pliki i katalogi:

  • Controllers\AccountController
  • Models\AccountModels
  • Views\Shared\_LogOnPartial
  • Views\Account (i wszystkie pliki w tym katalogu)

Wyrażenie soln

Edytuj plik _Layout.cshtml i zastąp znaczniki wewnątrz <div> elementu o nazwie logindisplay komunikatem "Logowanie wyłączone". W poniższym przykładzie pokazano nowy znacznik:

<div id="logindisplay">
  Login Disabled
</div>

Dodawanie modelu

W Eksplorator rozwiązań kliknij prawym przyciskiem myszy folder Models, wybierz polecenie Dodaj, a następnie kliknij pozycję Klasa.

Nowa klasa Mdl użytkownika

Nadaj klasie UserModelnazwę . Zastąp zawartość pliku UserModel następującym kodem:

using System.ComponentModel.DataAnnotations;
using System.Collections.Generic;

namespace Mvc3Razor.Models {
    public class UserModel {

        [Required]
        [StringLength(6, MinimumLength = 3)]
        [Display(Name = "User Name")]
        [RegularExpression(@"(\S)+", ErrorMessage = "White space is not allowed")]
        [ScaffoldColumn(false)]
        public string UserName { get; set; }

        [Required]
        [StringLength(8, MinimumLength = 3)]
        [Display(Name = "First Name")]
        public string FirstName { get; set; }
        [Required]
        [StringLength(9, MinimumLength = 2)]
        [Display(Name = "Last Name")]
        public string LastName { get; set; }
        [Required()]
        public string City { get; set; }

    }

    public class Users {

        public Users() {
            _usrList.Add(new UserModel
            {
                UserName = "BenM",
                FirstName = "Ben",
                LastName = "Miller",
                City = "Seattle"
            });
            _usrList.Add(new UserModel
            {
                UserName = "AnnB",
                FirstName = "Ann",
                LastName = "Beebe",
                City = "Boston"
            });
        }

        public List<UserModel> _usrList = new List<UserModel>();

        public void Update(UserModel umToUpdate) {

            foreach (UserModel um in _usrList) {
                if (um.UserName == umToUpdate.UserName) {
                    _usrList.Remove(um);
                    _usrList.Add(umToUpdate);
                    break;
                }
            }
        }

        public void Create(UserModel umToUpdate) {
            foreach (UserModel um in _usrList) {
                if (um.UserName == umToUpdate.UserName) {
                    throw new System.InvalidOperationException("Duplicat username: " + um.UserName);
                }
            }
            _usrList.Add(umToUpdate);
        }

        public void Remove(string usrName) {

            foreach (UserModel um in _usrList) {
                if (um.UserName == usrName) {
                    _usrList.Remove(um);
                    break;
                }
            }
        }

        public  UserModel GetUser(string uid) {
            UserModel usrMdl = null;

            foreach (UserModel um in _usrList)
                if (um.UserName == uid)
                    usrMdl = um;

            return usrMdl;
        }

    }    
}

Klasa UserModel reprezentuje użytkowników. Każdy element członkowski klasy jest oznaczony adnotacją z atrybutem Required z przestrzeni nazw DataAnnotations . Atrybuty w przestrzeni nazw DataAnnotations zapewniają automatyczną weryfikację po stronie klienta i serwera dla aplikacji internetowych.

Otwórz klasę HomeController i dodaj dyrektywę using , aby uzyskać dostęp do UserModel klas i Users :

using Mvc3Razor.Models;

Tuż po deklaracji HomeController dodaj następujący komentarz i odwołanie do Users klasy:

public class HomeController : Controller {

// The __usrs class is replacement for a real data access strategy.
private static Users _usrs = new Users();

Klasa Users jest uproszczonym magazynem danych w pamięci, który będzie używany w tym samouczku. W rzeczywistej aplikacji należy użyć bazy danych do przechowywania informacji o użytkowniku. W poniższym przykładzie HomeController pokazano kilka pierwszych wierszy pliku:

using System.Web.Mvc;
using Mvc3Razor.Models;

namespace Mvc3Razor.Controllers {
       
    public class HomeController : Controller {

        // The __usrs class is replacement for a real data access strategy.
        private static Users _usrs = new Users();

Skompiluj aplikację, aby model użytkownika był dostępny dla kreatora tworzenia szkieletów w następnym kroku.

Tworzenie widoku domyślnego

Następnym krokiem jest dodanie metody akcji i widoku w celu wyświetlenia użytkowników.

Usuń istniejący plik Views\Home\Index . Utworzysz nowy plik indeksu , aby wyświetlić użytkowników.

HomeController W klasie zastąp zawartość Index metody następującym kodem:

return View(_usrs._usrList);

Kliknij prawym przyciskiem myszy wewnątrz Index metody, a następnie kliknij polecenie Dodaj widok.

Dodaj widok

Wybierz opcję Utwórz silnie typizowany widok . W obszarze Wyświetl klasę danych wybierz pozycję Mvc3Razor.Models.UserModel. (Jeśli nie widzisz modelu Mvc3Razor.Models.UserModel w polu Wyświetl klasę danych , musisz skompilować projekt). Upewnij się, że aparat wyświetlania jest ustawiony na Razor. Ustaw opcję Wyświetl zawartość na Listę , a następnie kliknij przycisk Dodaj.

Dodawanie widoku indeksu

Nowy widok automatycznie szkieletuje dane użytkownika, które są przekazywane do Index widoku. Sprawdź nowo wygenerowany plik Views\Home\Index . Linki Utwórz nowy, Edytuj, Szczegóły i Usuń nie działają, ale pozostała część strony jest funkcjonalna. Uruchom stronę. Zostanie wyświetlona lista użytkowników.

Strona indeksu

Otwórz plik Index.cshtml i zastąp ActionLinkznaczniki Edit, Details i Delete następującym kodem:

@Html.ActionLink("Edit", "Edit", new {  id=item.UserName  }) |
@Html.ActionLink("Details", "Details", new {  id=item.UserName  }) |
@Html.ActionLink("Delete", "Delete", new {  id=item.UserName  })

Nazwa użytkownika jest używana jako identyfikator w celu znalezienia wybranego rekordu w linkach Edytuj, Szczegóły i Usuń .

Tworzenie widoku szczegółów

Następnym krokiem Details jest dodanie metody akcji i widoku w celu wyświetlenia szczegółów użytkownika.

Zrzut ekranu przedstawia pola szczegółów z wartościami UserName, FirstName, LastName i City dla użytkownika.

Dodaj następującą Details metodę do kontrolera macierzystego:

public ViewResult Details(string id) {
    return View(_usrs.GetUser(id));
}

Kliknij prawym przyciskiem myszy wewnątrz Details metody, a następnie wybierz polecenie Dodaj widok. Sprawdź, czy pole Wyświetl klasę danych zawiera mvc3Razor.Models.UserModel. Ustaw pozycję Wyświetl zawartość na Szczegóły , a następnie kliknij przycisk Dodaj.

Dodawanie widoku szczegółów

Uruchom aplikację i wybierz link szczegółów. Automatyczne tworzenie szkieletów pokazuje każdą właściwość w modelu.

Zrzut ekranu przedstawia pola szczegółów z wartościami dla użytkownika.

Tworzenie widoku edycji

Dodaj następującą Edit metodę do kontrolera macierzystego.

public ViewResult Edit(string id) {
    return View(_usrs.GetUser(id));
}

[HttpPost]
public ViewResult Edit(UserModel um) {

    if (!TryUpdateModel(um)) {
        ViewBag.updateError = "Update Failure";
        return View(um);
    }

    // ToDo: add persistent to DB.
    _usrs.Update(um);
    return View("Details", um);
}

Dodaj widok, tak jak w poprzednich krokach, ale ustaw opcję Wyświetl zawartość na Edytuj.

Dodawanie widoku edycji

Uruchom aplikację i edytuj imię i nazwisko jednego z użytkowników. Jeśli naruszysz jakiekolwiek DataAnnotation ograniczenia, które zostały zastosowane do UserModel klasy, podczas przesyłania formularza zostaną wyświetlone błędy walidacji generowane przez kod serwera. Jeśli na przykład zmienisz imię "Ann" na "A", podczas przesyłania formularza w formularzu zostanie wyświetlony następujący błąd:

The field First Name must be a string with a minimum length of 3 and a maximum length of 8.

W tym samouczku traktujesz nazwę użytkownika jako klucz podstawowy. W związku z tym nie można zmienić właściwości nazwy użytkownika. W pliku Edit.cshtml tuż po instrukcji Html.BeginForm ustaw nazwę użytkownika na ukryte pole. Powoduje to przekazanie właściwości w modelu. Poniższy fragment kodu przedstawia umieszczanie instrukcji Hidden :

<h2>Edit</h2>
    @using (Html.BeginForm()) {
@Html.Hidden("UserName", Model.UserName)

Zastąp znaczniki TextBoxFor i ValidationMessageFor dla nazwy użytkownika wywołaniem DisplayFor . Metoda DisplayFor wyświetla właściwość jako element tylko do odczytu. W poniższym przykładzie pokazano ukończone znaczniki. Oryginał TextBoxFor i ValidationMessageFor wywołania są oznaczone znakami początku i komentarza Razor (@* *@)

<div class="editor-label">
  @Html.LabelFor(model => model.UserName)
</div>

<div class="editor-field">
@*
  @Html.TextBoxFor(model => model.UserName)
  @Html.ValidationMessageFor(model => model.UserName)
*@
@Html.DisplayFor(model => model.UserName)
</div>

Włączanie weryfikacji Client-Side

Aby włączyć weryfikację po stronie klienta w ASP.NET MVC 3, należy ustawić dwie flagi i dołączyć trzy pliki JavaScript.

Otwórz plik Web.config aplikacji. Sprawdź that ClientValidationEnabled i UnobtrusiveJavaScriptEnabled ustawiono wartość true w ustawieniach aplikacji. Poniższy fragment z głównego pliku Web.config pokazuje poprawne ustawienia:

<appSettings>
  <add key="ClientValidationEnabled" value="true"/> 
  <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 
 </appSettings>

Ustawienie UnobtrusiveJavaScriptEnabled wartości true umożliwia nietrudne sprawdzanie poprawności klienta Ajax i dyskretne. W przypadku korzystania z niestrudyjnej weryfikacji reguły walidacji są przekształcane w atrybuty HTML5. Nazwy atrybutów HTML5 mogą składać się tylko z małych liter, cyfr i kresek.

Ustawienie ClientValidationEnabled wartości true umożliwia walidację po stronie klienta. Ustawiając te klucze w pliku Web.config aplikacji, włączysz walidację klienta i nieuprawialny kod JavaScript dla całej aplikacji. Możesz również włączyć lub wyłączyć te ustawienia w poszczególnych widokach lub w metodach kontrolera przy użyciu następującego kodu:

HtmlHelper.ClientValidationEnabled = true; 
HtmlHelper.UnobtrusiveJavaScriptEnabled = true;

Musisz również dołączyć kilka plików JavaScript w renderowany widok. Łatwym sposobem uwzględnienia kodu JavaScript we wszystkich widokach jest dodanie ich do pliku Views\Shared\_Layout.cshtml . Zastąp <head> element pliku _Layout.cshtml następującym kodem:

<head>
  <title>@View.Title</title>
  <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
  <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.4.2.min.js"></script>
  <script src="https://ajax.aspnetcdn.com/ajax/jquery.validate/1.7/jquery.validate.min.js"></script>
  <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
</head>

Dwa pierwsze skrypty jQuery są hostowane przez usługę Microsoft Ajax Content Delivery Network (CDN). Korzystając z usługi Microsoft Ajax CDN, możesz znacznie poprawić wydajność aplikacji.

Uruchom aplikację i kliknij link edytuj. Wyświetl źródło strony w przeglądarce. Źródło przeglądarki wyświetla wiele atrybutów formularza data-val (na potrzeby walidacji danych). Gdy jest włączona walidacja klienta i nieuprawialny kod JavaScript, pola wejściowe z regułą weryfikacji klienta zawierają data-val="true" atrybut wyzwalający nieuprawną walidację klienta. Na przykład City pole w modelu zostało ozdobione atrybutem Wymagane , co powoduje wyświetlenie kodu HTML w poniższym przykładzie:

<div class="editor-field">
  <input data-val="true" data-val-required="The City field is required." id="City" name="City" type="text" value="Seattle" />
  <span class="field-validation-valid" data-valmsg-for="City" data-valmsg-replace="true"></span>
</div>

Dla każdej reguły weryfikacji klienta dodawany jest atrybut z formularzem data-val-rulename="message". Korzystając z przedstawionego wcześniej przykładu City pola, wymagana reguła weryfikacji klienta generuje data-val-required atrybut i komunikat "Pole miasto jest wymagane". Uruchom aplikację, zmodyfikuj jednego z użytkowników i wyczyść City pole. Po wylogowaniu się z pola zostanie wyświetlony komunikat o błędzie weryfikacji po stronie klienta.

Wymagane miasto

Podobnie dla każdego parametru w regule weryfikacji klienta dodawany jest atrybut z formularzem data-val-rulename-paramname=paramvalue. Na przykład FirstName właściwość jest oznaczona adnotacją z atrybutem StringLength i określa minimalną długość 3 i maksymalną długość 8. Reguła walidacji danych o nazwie length ma nazwę max parametru i wartość parametru 8. Poniżej przedstawiono kod HTML wygenerowany dla FirstName pola podczas edytowania jednego z użytkowników:

<input data-val="true"         
       data-val-length="The field First Name must be a string with a minimum length of 3 and a maximum length of 8." 
       data-val-length-max="8" 
       data-val-length-min="3" 
       data-val-required="The First Name field is required." 
       id="FirstName" 
       name="FirstName" 
       type="text" 
       value="Ben" />

Aby uzyskać więcej informacji na temat nieuprawniania weryfikacji klienta, zobacz wpis Unobtrusive Client Validation in ASP.NET MVC 3 in Brad Wilson's blog(Unobtrusive Client Validation in ASP.NET MVC 3 in Brad Wilson's blog).

Uwaga

W ASP.NET MVC 3 Beta czasami trzeba przesłać formularz, aby rozpocząć walidację po stronie klienta. Może to zostać zmienione w ostatecznej wersji.

Tworzenie widoku tworzenia

Następnym krokiem Create jest dodanie metody akcji i widoku w celu umożliwienia użytkownikowi utworzenia nowego użytkownika. Dodaj następującą Create metodę do kontrolera głównego:

public ViewResult Create() {
    return View(new UserModel());
}

[HttpPost]
public ViewResult Create(UserModel um) {

    if (!TryUpdateModel(um)) {
        ViewBag.updateError = "Create Failure";
        return View(um);
    }

    // ToDo: add persistent to DB.
    _usrs.Create(um);
    return View("Details", um);
}

Dodaj widok tak jak w poprzednich krokach, ale ustaw opcję Wyświetl zawartość na Utwórz.

Utwórz widok

Uruchom aplikację, wybierz link Utwórz i dodaj nowego użytkownika. Metoda Create automatycznie korzysta z weryfikacji po stronie klienta i po stronie serwera. Spróbuj wprowadzić nazwę użytkownika zawierającą białe znaki, takie jak "Ben X". Po wybraniu karty z pola nazwa użytkownika zostanie wyświetlony błąd weryfikacji po stronie klienta (White space is not allowed).

Dodawanie metody Delete

Aby ukończyć samouczek, dodaj następującą Delete metodę do kontrolera macierzystego:

public ViewResult Delete(string id) {
    return View(_usrs.GetUser(id));
}

[HttpPost]
public RedirectToRouteResult Delete(string id, FormCollection collection) {
    _usrs.Remove(id);
    return RedirectToAction("Index");
}

Delete Dodaj widok tak jak w poprzednich krokach, ustawiając opcję Wyświetl zawartość na Usuń.

Usuń widok

Masz teraz prostą, ale w pełni funkcjon ASP.NET alną aplikację MVC 3 z walidacją.