Поделиться через


Добавление метода Create и представления Create

Скотт Хансельман (Scott Hanselman)

В этом руководстве для начинающих рассматриваются основы ASP.NET MVC. Вы создадите простое веб-приложение, которое считывает и записывает данные из базы данных. Посетите центр обучения ASP.NET MVC , чтобы найти другие ASP.NET учебники и примеры MVC.

В этом разделе мы реализуем поддержку, необходимую для того, чтобы пользователи могли создавать новые фильмы в нашей базе данных. Для этого мы реализуем действие /Movies/Create URL.

Реализация URL-адреса /Movies/Create выполняется в два этапа. Когда пользователь впервые посещает URL-адрес /Movies/Create, мы хотим показать ему HTML-форму, которую он может заполнить, чтобы ввести новый фильм. Затем, когда пользователь отправляет форму и отправляет данные обратно на сервер, мы хотим получить размещенное содержимое и сохранить его в базе данных.

Мы реализуем эти два шага в двух методах Create() в классе MoviesController. Один из методов показывает <форму> , которую пользователь должен заполнить, чтобы создать новый фильм. Второй метод обрабатывает опубликованные данные, когда пользователь отправляет <форму> обратно на сервер и сохраняет новый фильм в нашей базе данных.

Ниже приведен код, который мы добавим в класс MoviesController для реализации этого:

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

[HttpPost]
public ActionResult Create(Movie newMovie)
{

    if (ModelState.IsValid)
    {
        db.AddToMovies(newMovie);
        db.SaveChanges();

        return RedirectToAction("Index");
    }
    else
    {
        return View(newMovie);
    }
}

Приведенный выше код содержит весь код, который нам понадобится в контроллере.

Теперь реализуем шаблон Создания представления, который будет использоваться для отображения формы пользователю. Мы щелкнум правой кнопкой мыши первый метод Create и выберите "Добавить представление", чтобы создать шаблон представления для формы "Фильм".

Мы выберем, что мы передадим шаблон представления "Movie" в качестве класса данных представления, и укажем, что мы хотим "сформировать" шаблон "Создать".

Добавление представления

После нажатия кнопки Добавить будет создан шаблон представления \Movies\Create.aspx. Так как мы выбрали "Создать" в раскрывающемся списке "Просмотр содержимого", диалоговое окно "Добавление представления" автоматически "формирует" некоторое содержимое по умолчанию. Формирование шаблонов создало HTML-форму<>, место для отправки сообщений об ошибках проверки, а так как формирование шаблонов известно о Movies, оно создало метку и поля для каждого свойства нашего класса.

<% using (Html.BeginForm()) {%>
    <%: Html.ValidationSummary(true) %>

    <fieldset>
        <legend>Fields</legend>
       
        <div class="editor-label">
            <%: Html.LabelFor(model => model.Id) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.Id) %>
            <%: Html.ValidationMessageFor(model => model.Id) %>
        </div>
       
        <div class="editor-label">
            <%: Html.LabelFor(model => model.Title) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.Title) %>
            <%: Html.ValidationMessageFor(model => model.Title) %>
        </div>
       
        <div class="editor-label">
            <%: Html.LabelFor(model => model.ReleaseDate) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.ReleaseDate) %>
            <%: Html.ValidationMessageFor(model => model.ReleaseDate) %>
        </div>
       
        <div class="editor-label">
            <%: Html.LabelFor(model => model.Genre) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.Genre) %>
            <%: Html.ValidationMessageFor(model => model.Genre) %>
        </div>
       
        <div class="editor-label">
            <%: Html.LabelFor(model => model.Price) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.Price) %>
            <%: Html.ValidationMessageFor(model => model.Price) %>
        </div>
       
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>

<% } %>

Так как наша база данных автоматически предоставляет идентификатор Movie, давайте удалим поля, которые ссылались на модель. Идентификатор из нашего представления создания. Удалите 7 строк после <поля< или легенды> легенды>, так как в них отображается поле идентификатора, которое нам не нужно.

Теперь создадим новый фильм и добавим его в базу данных. Для этого мы снова запустив приложение, перейдем по URL-адресу /Movies и щелкните ссылку "Создать", чтобы добавить новый фильм.

Создание — Windows Internet Обозреватель

При нажатии кнопки Создать мы отправим данные в этой форме (через HTTP POST) в только что созданный метод /Movies/Create. Подобно тому, как система автоматически извлекла параметры numTimes и name из URL-адреса и сопоставляла их с параметрами метода ранее, система автоматически принимает поля формы из POST и сопоставляет их с объектом. В этом случае значения из полей в HTML, таких как ReleaseDate и Title, будут автоматически помещены в правильные свойства нового экземпляра Movie.

Давайте снова рассмотрим второй метод Create из MoviesController. Обратите внимание, что объект Movie принимается в качестве аргумента:

[HttpPost]
public ActionResult Create(Movie newMovie)
{
    if (ModelState.IsValid)
    {
        db.AddToMovies(newMovie);
        db.SaveChanges();

        return RedirectToAction("Index");
    }
    else
    {
        return View(newMovie);
    }
}

Затем этот объект Movie был передан в версию [HttpPost] нашего метода действия Create, и мы сохранили его в базе данных, а затем перенаправили пользователя обратно в метод действия Index(), который отобразит сохраненный результат в списке фильмов:

Список фильмов — Интернет-Обозреватель Windows

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