Adicionar um Criar Método e um Criar Exibição
por Scott Hanselman
Este é um tutorial iniciante que apresenta os conceitos básicos de ASP.NET MVC. Você criará um aplicativo Web simples que lê e grava de um banco de dados. Visite o centro de aprendizagem do ASP.NET MVC para encontrar outros tutoriais e exemplos do MVC ASP.NET.
Nesta seção, implementaremos o suporte necessário para permitir que os usuários criem novos filmes em nosso banco de dados. Faremos isso implementando a ação /Movies/Create URL.
Implementar a URL /Movies/Create é um processo de duas etapas. Quando um usuário visita pela primeira vez a URL /Movies/Create, queremos mostrar um formulário HTML que ele pode preencher para inserir um novo filme. Em seguida, quando o usuário envia o formulário e posta os dados de volta no servidor, queremos recuperar o conteúdo postado e salvá-los em nosso banco de dados.
Implementaremos essas duas etapas em dois métodos Create() em nossa classe MoviesController. Um método mostrará o <formulário> que o usuário deve preencher para criar um novo filme. O segundo método tratará o processamento dos dados postados quando o usuário enviar o <formulário> de volta ao servidor e salvará um novo Filme em nosso banco de dados.
Abaixo está o código que adicionaremos à nossa classe MoviesController para implementar isso:
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);
}
}
O código acima contém todo o código que precisaremos em nosso Controlador.
Agora, vamos implementar o modelo Criar Exibição que usaremos para exibir um formulário para o usuário. Clicaremos com o botão direito do mouse no primeiro método Create e selecionaremos "Adicionar Exibição" para criar o modelo de exibição para nosso formulário De filme.
Vamos selecionar que vamos passar o modelo de exibição como "Filme" como sua classe de dados de exibição e indicar que queremos "criar" um modelo de "Criar".
Depois de clicar no botão Adicionar, o modelo \Movies\Create.aspx View será criado para você. Como selecionamos "Criar" na lista suspensa "exibir conteúdo", a caixa de diálogo Adicionar Exibição automaticamente "scaffolded" algum conteúdo padrão para nós. O scaffolding criou um formulário> HTML<, um local para a validação de mensagens de erro e, como o scaffolding sabe sobre Filmes, ele criou Rótulo e Campos para cada propriedade de nossa classe.
<% 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>
<% } %>
Como nosso banco de dados fornece automaticamente uma ID de Filme, vamos remover os campos que referenciam o modelo. Id do nosso Modo de Exibição de Criação. Remova as 7 linhas após <a legenda>Campos</legenda> , pois elas mostram o campo ID que não queremos.
Agora vamos criar um novo filme e adicioná-lo ao banco de dados. Faremos isso executando o aplicativo novamente e visitaremos a URL "/Filmes" e clicaremos no link "Criar" para adicionar um novo Filme.
Quando clicarmos no botão Criar, publicaremos de volta (via HTTP POST) os dados neste formulário para o método /Movies/Create que acabamos de criar. Assim como quando o sistema retirou automaticamente o parâmetro "numTimes" e "name" da URL e mapeou-os para parâmetros em um método anteriormente, o sistema pegará automaticamente os Campos de Formulário de um POST e os mapeará para um objeto. Nesse caso, valores de campos em HTML como "ReleaseDate" e "Title" serão colocados automaticamente nas propriedades corretas de uma nova instância de um Filme.
Vamos examinar o segundo método Create de nosso MoviesController novamente. Observe como ele usa um objeto "Movie" como um argumento:
[HttpPost]
public ActionResult Create(Movie newMovie)
{
if (ModelState.IsValid)
{
db.AddToMovies(newMovie);
db.SaveChanges();
return RedirectToAction("Index");
}
else
{
return View(newMovie);
}
}
Esse objeto Movie foi então passado para a versão [HttpPost] do nosso método de ação Criar e o salvamos no banco de dados e redirecionamos o usuário de volta para o método de ação Index(), que mostrará o resultado salvo na lista de filmes:
No entanto, não estamos verificando se nossos filmes estão corretos e o banco de dados não nos permitirá salvar um filme sem Título. Seria bom se pudéssemos dizer ao usuário que antes que o banco de dados gerasse um erro. Faremos isso em seguida adicionando suporte à validação ao nosso aplicativo.