Compartilhar via


Apresentando Páginas da Web do ASP.NET – Atualizando dados de banco de dados

por Tom FitzMacken

Este tutorial mostra como atualizar (alterar) uma entrada de banco de dados existente ao usar Páginas da Web do ASP.NET (Razor). Ele pressupõe que você concluiu a série por meio da inserção de dados usando formulários usando Páginas da Web do ASP.NET.

O que você aprenderá:

  • Como selecionar um registro individual no WebGrid auxiliar.
  • Como ler um único registro de um banco de dados.
  • Como pré-carregar um formulário com valores do registro de banco de dados.
  • Como atualizar um registro existente em um banco de dados.
  • Como armazenar informações na página sem exibi-la.
  • Como usar um campo oculto para armazenar informações.

Recursos/tecnologias discutidos:

  • O WebGrid auxiliar.
  • O comando SQL Update .
  • O método Database.Execute.
  • Campos ocultos (<input type="hidden">).

O que você vai construir

No tutorial anterior, você aprendeu a adicionar um registro a um banco de dados. Aqui, você aprenderá a exibir um registro para edição. Na página Filmes , você atualizará o WebGrid auxiliar para que ele exiba um link Editar ao lado de cada filme:

Exibição do WebGrid, incluindo um link 'Editar' para cada filme

Quando você clica no link Editar , ele leva você para uma página diferente, em que as informações do filme já estão em um formulário:

Página Editar Filme mostrando o filme a ser editado

Você pode alterar qualquer um dos valores. Quando você envia as alterações, o código na página atualiza o banco de dados e o leva de volta à listagem de filmes.

Essa parte do processo funciona quase exatamente como a página AddMovie.cshtml que você criou no tutorial anterior, portanto, muito deste tutorial será familiar.

Há várias maneiras de implementar uma maneira de editar um filme individual. A abordagem mostrada foi escolhida porque é fácil de implementar e fácil de entender.

Para começar, você atualizará a página Filmes para que cada listagem de filmes também contenha um link Editar .

Abra o arquivo Movies.cshtml .

No corpo da página, altere a marcação adicionando WebGrid uma coluna. Aqui está a marcação modificada:

@grid.GetHtml(
    tableStyle: "grid",
    headerStyle: "head",
    alternatingRowStyle: "alt",
    columns: grid.Columns(
        grid.Column(format: @<a href="~/EditMovie?id=@item.ID">Edit</a>),
        grid.Column("Title"),
        grid.Column("Genre"),
        grid.Column("Year")
    )
)

A nova coluna é esta:

grid.Column(format: @<a href="~/EditMovie?id=@item.ID)">Edit</a>)

O ponto desta coluna é mostrar um link (<a> elemento) cujo texto diz "Editar". O que queremos é criar um link semelhante ao seguinte quando a página for executada, com o id valor diferente para cada filme:

http://localhost:43097/EditMovie?id=7

Esse link invocará uma página chamada EditMovie e passará a cadeia de caracteres ?id=7 de consulta para essa página.

A sintaxe da nova coluna pode parecer um pouco complexa, mas isso é apenas porque ela reúne vários elementos. Cada elemento individual é simples. Se você se concentrar apenas no <a> elemento , verá esta marcação:

<a href="~/EditMovie?id=@item.ID)">Edit</a>

Alguns planos de fundo sobre como a grade funciona: a grade exibe linhas, uma para cada registro de banco de dados e exibe colunas para cada campo no registro do banco de dados. Enquanto cada linha de grade está sendo construída, o item objeto contém o registro de banco de dados (item) dessa linha. Essa disposição fornece uma maneira no código de obter os dados dessa linha. Isso é o que você vê aqui: a expressão item.ID está recebendo o valor de ID do item de banco de dados atual. Você pode obter qualquer um dos valores de banco de dados (título, gênero ou ano) da mesma maneira usando item.Title, item.Genreou item.Year.

A expressão "~/EditMovie?id=@item.ID combina a parte embutida em código da URL de destino (~/EditMovie?id=) com essa ID derivada dinamicamente. (Você viu o ~ operador no tutorial anterior; é um operador ASP.NET que representa a raiz do site atual.)

O resultado é que essa parte da marcação na coluna simplesmente produz algo semelhante à seguinte marcação em tempo de execução:

href="/EditMovie?id=2"

Naturalmente, o valor real de id será diferente para cada linha.

Criando uma exibição personalizada para uma coluna de grade

Agora, volte para a coluna de grade. As três colunas originalmente que você tinha na grade exibiam apenas valores de dados (título, gênero e ano). Você especificou essa exibição passando o nome da coluna de banco de dados , por exemplo, grid.Column("Title").

Esta nova coluna Editar link é diferente. Em vez de especificar um nome de coluna, você está passando um format parâmetro. Esse parâmetro permite definir a marcação que o WebGrid auxiliar renderizará junto com o item valor para exibir os dados da coluna como negrito ou verde ou em qualquer formato desejado. Por exemplo, se você quisesse que o título aparecesse em negrito, poderia criar uma coluna como este exemplo:

grid.Column(format:@<strong>@item.Title</strong>)

(Os vários caracteres @ que você vê na propriedade marcam format a transição entre marcação e um valor de código.)

Depois que você souber sobre a format propriedade, é mais fácil entender como a nova coluna Editar link é montada:

grid.Column(format: @<a href="~/EditMovie?id=@item.ID">Edit</a>),

A coluna consiste apenas na marcação que renderiza o link, além de algumas informações (a ID) extraídas do registro de banco de dados da linha.

Dica

Parâmetros nomeados e parâmetros posicionais para um método

Muitas vezes, quando você chamou um método e passou parâmetros para ele, você simplesmente listou os valores de parâmetro separados por vírgulas. Aqui estão alguns exemplos:

db.Execute(insertCommand, title, genre, year)

Validation.RequireField("title", "You must enter a title")

Não menção o problema quando você viu esse código pela primeira vez, mas, em cada caso, você está passando parâmetros para os métodos em uma ordem específica, ou seja, a ordem na qual os parâmetros são definidos nesse método. Para db.Execute e Validation.RequireFields, se você misturou a ordem dos valores passados, receberá uma mensagem de erro quando a página for executada ou pelo menos alguns resultados estranhos. Claramente, você precisa saber a ordem para passar os parâmetros. (No WebMatrix, o IntelliSense pode ajudá-lo a descobrir o nome, o tipo e a ordem dos parâmetros.)

Como alternativa à passagem de valores em ordem, você pode usar parâmetros nomeados. (Passar parâmetros em ordem é conhecido como usando parâmetros posicionais.) Para parâmetros nomeados, você inclui explicitamente o nome do parâmetro ao passar seu valor. Você já usou parâmetros nomeados várias vezes nestes tutoriais. Por exemplo:

var grid = new WebGrid(source: selectedData, defaultSort: "Genre", rowsPerPage:3)

e

@grid.GetHtml(
    tableStyle: "grid",
    headerStyle: "head",
    alternatingRowStyle: "alt",
    columns: grid.Columns(
       grid.Column("Title"),
       grid.Column("Genre"),
       grid.Column("Year")
    )
)

Parâmetros nomeados são úteis para algumas situações, especialmente quando um método usa muitos parâmetros. Um deles é quando você deseja passar apenas um ou dois parâmetros, mas os valores que você deseja passar não estão entre as primeiras posições na lista de parâmetros. Outra situação é quando você deseja tornar seu código mais legível passando os parâmetros na ordem que faz mais sentido para você.

Obviamente, para usar parâmetros nomeados, você precisa saber os nomes dos parâmetros. O WebMatrix IntelliSense pode mostrar os nomes, mas atualmente não pode preenchê-los para você.

Criando a página Editar

Agora você pode criar a página EditMovie . Quando os usuários clicarem no link Editar , eles acabarão nesta página.

Crie uma página chamada EditMovie.cshtml e substitua o que está no arquivo pela seguinte marcação:

<!DOCTYPE html>
<html>
  <head>
   <meta charset="utf-8" />
   <title>Edit a Movie</title>
    <style>
      .validation-summary-errors{
        border:2px dashed red;
        color:red;
        font-weight:bold;
        margin:12px;
      }
    </style>
  </head>
  <body>
    <h1>Edit a Movie</h1>
    @Html.ValidationSummary()
    <form method="post">
      <fieldset>
        <legend>Movie Information</legend>

        <p><label for="title">Title:</label>
           <input type="text" name="title" value="@title" /></p>

        <p><label for="genre">Genre:</label>
           <input type="text" name="genre" value="@genre" /></p>

        <p><label for="year">Year:</label>
           <input type="text" name="year" value="@year" /></p>

        <input type="hidden" name="movieid" value="@movieId" />

        <p><input type="submit" name="buttonSubmit" value="Submit Changes" /></p>
      </fieldset>
    </form>
  </body>
</html>

Essa marcação e o código são semelhantes ao que você tem na página AddMovie . Há uma pequena diferença no texto para o botão enviar. Assim como acontece com a página AddMovie , há uma Html.ValidationSummary chamada que exibirá erros de validação se houver algum. Desta vez, estamos deixando de fora as chamadas para Validation.Message, já que os erros serão exibidos no resumo da validação. Conforme observado no tutorial anterior, você pode usar o resumo de validação e as mensagens de erro individuais em várias combinações.

Observe novamente que o method atributo do <form> elemento está definido como post. Assim como acontece com a página AddMovie.cshtml , essa página faz alterações no banco de dados. Portanto, esse formulário deve executar uma POST operação. (Para saber mais sobre a diferença entre GET as operações e POST , consulte a barra lateral GET, POST e HTTP Verb Safety no tutorial sobre formulários HTML.)

Como você viu em um tutorial anterior, os value atributos das caixas de texto estão sendo definidos com o código Razor para pré-recarregá-los. Desta vez, porém, você está usando variáveis como title e genre para essa tarefa em vez de Request.Form["title"]:

<input type="text" name="title" value="@title" />

Como antes, essa marcação pré-carregará os valores da caixa de texto com os valores de filme. Você verá em um momento por que é útil usar variáveis desta vez em vez de usar o Request objeto .

Também há um <input type="hidden"> elemento nesta página. Esse elemento armazena a ID do filme sem torná-la visível na página. A ID é inicialmente passada para a página usando um valor de cadeia de caracteres de consulta (?id=7 ou semelhante na URL). Ao colocar o valor da ID em um campo oculto, você pode verificar se ele está disponível quando o formulário é enviado, mesmo que você não tenha mais acesso à URL original com a qual a página foi invocada.

Ao contrário da página AddMovie , o código da página EditMovie tem duas funções distintas. A primeira função é que, quando a página é exibida pela primeira vez (e somente depois), o código obtém a ID do filme da cadeia de caracteres de consulta. Em seguida, o código usa a ID para ler o filme correspondente do banco de dados e exibi-lo (pré-carregar) nas caixas de texto.

A segunda função é que, quando o usuário clica no botão Enviar Alterações , o código precisa ler os valores das caixas de texto e validá-los. O código também precisa atualizar o item de banco de dados com os novos valores. Essa técnica é semelhante à adição de um registro, como você viu em AddMovie.

Adicionando código para ler um único filme

Para executar a primeira função, adicione este código à parte superior da página:

@{
    var title = "";
    var genre = "";
    var year = "";
    var movieId = "";

    if(!IsPost){
        if(!Request.QueryString["ID"].IsEmpty()){
            movieId = Request.QueryString["ID"];
            var db = Database.Open("WebPagesMovies");
            var dbCommand = "SELECT * FROM Movies WHERE ID = @0";
            var row = db.QuerySingle(dbCommand, movieId);
            title = row.Title;
            genre = row.Genre;
            year = row.Year;
        }
        else{
            Validation.AddFormError("No movie was selected.");
        }
    }
}

A maior parte desse código está dentro de um bloco que inicia if(!IsPost). O ! operador significa "não", portanto, a expressão significa se essa solicitação não é um envio de postagem, o que é uma maneira indireta de dizer se essa solicitação é a primeira vez que essa página é executada. Conforme observado anteriormente, esse código deve ser executado apenas na primeira vez que a página for executada. Se você não colocasse o código em if(!IsPost), ele seria executado sempre que a página fosse invocada, seja na primeira vez ou em resposta a um clique de botão.

Observe que o código inclui um else bloco desta vez. Como dissemos quando introduzimos if blocos, às vezes você deseja executar código alternativo se a condição que você está testando não for verdadeira. Esse é o caso aqui. Se a condição for aprovada (ou seja, se a ID passada para a página estiver ok), você lerá uma linha do banco de dados. No entanto, se a condição não passar, o else bloco será executado e o código definirá uma mensagem de erro.

Validando um valor passado para a página

O código usa Request.QueryString["id"] para obter a ID passada para a página. O código garante que um valor tenha sido realmente passado para a ID. Se nenhum valor tiver sido passado, o código definirá um erro de validação.

Esse código mostra uma maneira diferente de validar informações. No tutorial anterior, você trabalhou com o Validation auxiliar. Você registrou campos para validar e ASP.NET fez automaticamente a validação e exibiu erros usando Html.ValidationMessage e Html.ValidationSummary. Nesse caso, no entanto, você não está realmente validando a entrada do usuário. Em vez disso, você está validando um valor que foi passado para a página de outro lugar. O Validation auxiliar não faz isso por você.

Portanto, você marcar o valor por conta própria, testando-o com if(!Request.QueryString["ID"].IsEmpty()). Se houver um problema, você poderá exibir o erro usando Html.ValidationSummary, como fez com o Validation auxiliar. Para fazer isso, chame Validation.AddFormError e passe uma mensagem para exibição. Validation.AddFormError é um método interno que permite definir mensagens personalizadas vinculadas ao sistema de validação com o qual você já está familiarizado. (Posteriormente neste tutorial, falaremos sobre como tornar esse processo de validação um pouco mais robusto.)

Depois de verificar se há uma ID para o filme, o código lê o banco de dados, procurando apenas um único item de banco de dados. (Você provavelmente notou o padrão geral para operações de banco de dados: abra o banco de dados, defina uma instrução SQL e execute a instrução .) Desta vez, a instrução SQL Select inclui WHERE ID = @0. Como a ID é exclusiva, apenas um registro pode ser retornado.

A consulta é executada usando db.QuerySingle (não db.Query, como você usou para a listagem de filmes) e o código coloca o resultado na row variável . O nome row é arbitrário; você pode nomear as variáveis como quiser. As variáveis inicializadas na parte superior são preenchidas com os detalhes do filme para que esses valores possam ser exibidos nas caixas de texto.

Testando a página Editar (até agora)

Se você quiser testar sua página, execute a página Filmes agora e clique em um link Editar ao lado de qualquer filme. Você verá a página EditMovie com os detalhes preenchidos para o filme selecionado:

A captura de tela mostra a página Editar Filme mostrando o filme a ser editado.

Observe que a URL da página inclui algo como ?id=10 (ou algum outro número). Até agora, você testou que Editar links na página Filme funciona, que sua página está lendo a ID da cadeia de caracteres de consulta e que a consulta de banco de dados para obter um único registro de filme está funcionando.

Você pode alterar as informações do filme, mas nada acontece quando você clica em Enviar Alterações.

Adicionando código para atualizar o filme com as alterações do usuário

No arquivo EditMovie.cshtml , para implementar a segunda função (salvando alterações), adicione o código a seguir dentro da chave de fechamento do @ bloco. (Se você não tiver certeza de exatamente onde colocar o código, poderá examinar a listagem de código completa para a página Editar Filme que aparece no final deste tutorial.)

if(IsPost){
    Validation.RequireField("title", "You must enter a title");
    Validation.RequireField("genre", "Genre is required");
    Validation.RequireField("year", "You haven't entered a year");
    Validation.RequireField("movieid", "No movie ID was submitted!");

    title = Request.Form["title"];
    genre = Request.Form["genre"];
    year = Request.Form["year"];
    movieId = Request.Form["movieId"];

    if(Validation.IsValid()){
        var db = Database.Open("WebPagesMovies");
        var updateCommand = "UPDATE Movies SET Title=@0, Genre=@1, Year=@2 WHERE Id=@3";
        db.Execute(updateCommand, title, genre, year, movieId);
        Response.Redirect("~/Movies");
   }
}

Novamente, essa marcação e o código são semelhantes ao código em AddMovie. O código está em um if(IsPost) bloco, pois esse código é executado somente quando o usuário clica no botão Enviar Alterações , ou seja, quando (e somente quando) o formulário foi postado. Nesse caso, você não está usando um teste como if(IsPost && Validation.IsValid()), ou seja, você não está combinando os dois testes usando AND. Nesta página, primeiro você determina se há um envio de formulário (if(IsPost)) e só depois registra os campos para validação. Em seguida, você pode testar os resultados da validação (if(Validation.IsValid()). O fluxo é ligeiramente diferente do da página AddMovie.cshtml , mas o efeito é o mesmo.

Você obtém os valores das caixas de texto usando Request.Form["title"] e código semelhante para os outros <input> elementos. Observe que, desta vez, o código obtém a ID do filme do campo oculto (<input type="hidden">). Quando a página foi executada pela primeira vez, o código tirou a ID da cadeia de caracteres de consulta. Você obtém o valor do campo oculto para garantir que está obtendo a ID do filme que foi exibido originalmente, caso a cadeia de caracteres de consulta tenha sido alterada de alguma forma desde então.

A diferença realmente importante entre o código AddMovie e esse código é que, nesse código, você usa a instrução SQL Update em vez da instrução Insert Into . O exemplo a seguir mostra a sintaxe da instrução SQL Update :

UPDATE table SET col1="value", col2="value", col3="value" ... WHERE ID = value

Você pode especificar todas as colunas em qualquer ordem e não precisa necessariamente atualizar todas as colunas durante uma Update operação. (Você não pode atualizar a ID em si, porque isso salvaria o registro como um novo registro e isso não é permitido para uma Update operação.)

Observação

Importante A Where cláusula com a ID é muito importante, pois é assim que o banco de dados sabe qual registro de banco de dados você deseja atualizar. Se você deixar de fora da Where cláusula , o banco de dados atualizará todos os registros no banco de dados. Na maioria dos casos, isso seria um desastre.

No código, os valores a serem atualizados são passados para a instrução SQL usando espaços reservados. Para repetir o que dissemos antes: por motivos de segurança, use apenas espaços reservados para passar valores para uma instrução SQL.

Depois que o código usa db.Execute para executar a Update instrução , ele redireciona de volta para a página de listagem, onde você pode ver as alterações.

Dica

Instruções SQL diferentes, métodos diferentes

Talvez você tenha notado que usa métodos ligeiramente diferentes para executar instruções SQL diferentes. Para executar uma Select consulta que potencialmente retorna vários registros, use o Query método . Para executar uma Select consulta que você sabe que retornará apenas um item de banco de dados, use o QuerySingle método . Para executar comandos que fazem alterações, mas que não retornam itens de banco de dados, use o Execute método .

Você precisa ter métodos diferentes porque cada um deles retorna resultados diferentes, como você já viu na diferença entre Query e QuerySingle. (Na verdade, o Execute método retorna um valor também — ou seja, o número de linhas de banco de dados que foram afetadas pelo comando — mas você tem ignorado isso até agora.)

É claro que o Query método pode retornar apenas uma linha de banco de dados. No entanto, ASP.NET sempre trata os resultados do Query método como uma coleção. Mesmo que o método retorne apenas uma linha, você precisará extrair essa única linha da coleção. Portanto, em situações em que você sabe que retornará apenas uma linha, é um pouco mais conveniente usar QuerySingle.

Há alguns outros métodos que executam tipos específicos de operações de banco de dados. Você pode encontrar uma listagem de métodos de banco de dados na Referência Rápida da API Páginas da Web do ASP.NET.

Tornando a validação para a ID mais robusta

Na primeira vez que a página é executada, você obtém a ID do filme da cadeia de caracteres de consulta para que possa obter esse filme do banco de dados. Você se certificou de que realmente havia um valor para procurar, o que você fez usando este código:

if(!IsPost){
    if(!Request.QueryString["ID"].IsEmpty()){
        // Etc.
    }
}

Você usou esse código para garantir que, se um usuário chegar à página EditMovies sem primeiro selecionar um filme na página Filmes , a página exibiria uma mensagem de erro amigável. (Caso contrário, os usuários veriam um erro que provavelmente os confundiria.)

No entanto, essa validação não é muito robusta. A página também pode ser invocada com estes erros:

  • A ID não é um número. Por exemplo, a página pode ser invocada com uma URL como http://localhost:nnnnn/EditMovie?id=abc.
  • A ID é um número, mas faz referência a um filme que não existe (por exemplo, http://localhost:nnnnn/EditMovie?id=100934).

Se você estiver curioso para ver os erros resultantes dessas URLs, execute a página Filmes . Selecione um filme para editar e altere a URL da página EditArMovie para uma URL que contém uma ID alfabética ou a ID de um filme inexistente.

Então, o que você deve fazer? A primeira correção é garantir que não apenas seja uma ID passada para a página, mas que a ID seja um inteiro. Altere o código para que o !IsPost teste se pareça com este exemplo:

if(!IsPost){
    if(!Request.QueryString["ID"].IsEmpty() && Request.QueryString["ID"].IsInt()) {
       // Etc.

Você adicionou uma segunda condição ao teste, vinculada a IsEmpty&& (AND lógico):

Request.QueryString["ID"].IsInt()

Você deve se lembrar do tutorial Introdução à Programação Páginas da Web do ASP.NET que métodos como AsBool um AsInt convertem uma cadeia de caracteres em algum outro tipo de dados. O IsInt método (e outros, como IsBool e IsDateTime) são semelhantes. No entanto, eles testam apenas se você pode converter a cadeia de caracteres, sem realmente executar a conversão. Portanto, aqui você está essencialmente dizendo Se o valor da cadeia de caracteres de consulta pode ser convertido em um inteiro ....

O outro problema em potencial é procurar um filme que não exista. O código para obter um filme é semelhante a este código:

var row = db.QuerySingle(dbCommand, movieId);

Se você passar um movieId valor para o QuerySingle método que não corresponde a um filme real, nada será retornado e as instruções a seguir (por exemplo, title=row.Title) resultarão em erros.

Novamente há uma solução fácil. Se o db.QuerySingle método não retornar resultados, a row variável será nula. Portanto, você pode marcar se a row variável é nula antes de tentar obter valores dela. O código a row seguir adiciona um if bloco em torno das instruções que obtêm os valores do objeto :

if(row != null) {
    title = row.Title;
    genre = row.Genre;
    year = row.Year;
}
else{
    Validation.AddFormError("No movie was found for that ID.");
}

Com esses dois testes de validação adicionais, a página se torna mais à prova de marcadores. O código completo do !IsPost branch agora se parece com este exemplo:

if(!IsPost){
    if(!Request.QueryString["ID"].IsEmpty() && Request.QueryString["ID"].IsInt()) {
        movieId = Request.QueryString["ID"];
        var db = Database.Open("WebPagesMovies");
        var dbCommand = "SELECT * FROM Movies WHERE ID = @0";
        var row = db.QuerySingle(dbCommand, movieId);

        if(row != null) {
            title = row.Title;
            genre = row.Genre;
            year = row.Year;
        }
        else {
            Validation.AddFormError("No movie was found for that ID.");
        }
    }
    else {
        Validation.AddFormError("No movie was selected.");
    }
}

Observaremos mais uma vez que essa tarefa é um bom uso para um else bloco. Se os testes não forem aprovados, os else blocos definirão mensagens de erro.

Um detalhe final e útil é adicionar um link de volta à página Filmes . No fluxo comum de eventos, os usuários começarão na página Filmes e clicarão em um link Editar . Isso os leva à página EditMovie , onde eles podem editar o filme e clicar no botão. Depois que o código processa a alteração, ele redireciona de volta para a página Filmes .

No entanto:

  • O usuário pode decidir não alterar nada.
  • O usuário pode ter chegado a esta página sem primeiro clicar em um link Editar na página Filmes .

De qualquer forma, você deseja tornar mais fácil para eles retornarem à listagem de main. É uma correção fácil – adicione a seguinte marcação logo após a marca de fechamento </form> na marcação:

<p><a href="~/Movies">Return to movie listing</a></p>

Essa marcação usa a mesma sintaxe para um <a> elemento que você viu em outro lugar. A URL inclui ~ a "raiz do site".

Testando o processo de atualização de filme

Agora você pode testar. Execute a página Filmes e clique em Editar ao lado de um filme. Quando a página EditMovie for exibida, faça alterações no filme e clique em Enviar Alterações. Quando a listagem de filmes for exibida, verifique se as alterações são mostradas.

Para garantir que a validação esteja funcionando, clique em Editar para outro filme. Quando você chegar à página EditMovie , desmarque o campo Gênero (ou o campo Ano ou ambos) e tente enviar suas alterações. Você verá um erro, como seria de esperar:

Página Editar Filme mostrando erros de validação

Clique no link Retornar à listagem de filmes para abandonar suas alterações e retornar à página Filmes .

Próximo passo a seguir

No próximo tutorial, você verá como excluir um registro de filme.

@{
    var db = Database.Open("WebPagesMovies") ;
    var selectCommand = "SELECT * FROM Movies";
    var searchTerm = "";

    if(!Request.QueryString["searchGenre"].IsEmpty() ) {
        selectCommand = "SELECT * FROM Movies WHERE Genre = @0";
        searchTerm = Request.QueryString["searchGenre"];
    }

    if(!Request.QueryString["searchTitle"].IsEmpty() ) {
        selectCommand = "SELECT * FROM Movies WHERE Title LIKE @0";
        searchTerm = "%" + Request.QueryString["searchTitle"] + "%";
    }

    var selectedData = db.Query(selectCommand, searchTerm);
    var grid = new WebGrid(source: selectedData, defaultSort: "Genre", rowsPerPage:3);
}

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>Movies</title>
        <style type="text/css">
          .grid { margin: 4px; border-collapse: collapse; width: 600px; }
          .grid th, .grid td { border: 1px solid #C0C0C0; padding: 5px; }
          .head { background-color: #E8E8E8; font-weight: bold; color: #FFF; }
          .alt { background-color: #E8E8E8; color: #000; }
        </style>
    </head>
    <body>
        <h1>Movies</h1>
          <form method="get">
              <div>
                <label for="searchGenre">Genre to look for:</label>
                <input type="text" name="searchGenre" value="@Request.QueryString["searchGenre"]" />
                <input type="Submit" value="Search Genre" /><br/>
                (Leave blank to list all movies.)<br/>
                </div>

              <div>
                  <label for="SearchTitle">Movie title contains the following:</label>
                  <input type="text" name="searchTitle" value="@Request.QueryString["searchTitle"]" />
                  <input type="Submit" value="Search Title" /><br/>
                </div>
            </form>

        <div>
             @grid.GetHtml(
                tableStyle: "grid",
                headerStyle: "head",
                alternatingRowStyle: "alt",
                columns: grid.Columns(
                    grid.Column(format: @<a href="~/EditMovie?id=@item.ID">Edit</a>),
                    grid.Column("Title"),
                    grid.Column("Genre"),
                    grid.Column("Year")
                )
            )
        </div>
    <p>
        <a href="~/AddMovie">Add a movie</a>
    </p>
    </body>
</html>

Lista de Páginas Completas para Editar Página de Filme

@{
    var title = "";
    var genre = "";
    var year = "";
    var movieId = "";

    if(!IsPost){
        if(!Request.QueryString["ID"].IsEmpty() && Request.QueryString["ID"].IsInt()) {
            movieId = Request.QueryString["ID"];
            var db = Database.Open("WebPagesMovies");
            var dbCommand = "SELECT * FROM Movies WHERE ID = @0";
            var row = db.QuerySingle(dbCommand, movieId);

            if(row != null) {
                title = row.Title;
                genre = row.Genre;
                year = row.Year;
            }
            else{
                Validation.AddFormError("No movie was selected.");
            }
        }
        else{
            Validation.AddFormError("No movie was selected.");
        }
    }

    if(IsPost){
        Validation.RequireField("title", "You must enter a title");
        Validation.RequireField("genre", "Genre is required");
        Validation.RequireField("year", "You haven't entered a year");
        Validation.RequireField("movieid", "No movie ID was submitted!");

        title = Request.Form["title"];
        genre = Request.Form["genre"];
        year = Request.Form["year"];
        movieId = Request.Form["movieId"];

        if(Validation.IsValid()){
            var db = Database.Open("WebPagesMovies");
            var updateCommand = "UPDATE Movies SET Title=@0, Genre=@1, Year=@2 WHERE Id=@3";
            db.Execute(updateCommand, title, genre, year, movieId);
            Response.Redirect("~/Movies");
        }
    }
}

<!DOCTYPE html>
<html>
  <head>
   <meta charset="utf-8" />
   <title>Edit a Movie</title>
    <style>
      .validation-summary-errors{
        border:2px dashed red;
        color:red;
        font-weight:bold;
        margin:12px;
      }
    </style>
  </head>
  <body>
    <h1>Edit a Movie</h1>
      @Html.ValidationSummary()
      <form method="post">
      <fieldset>
        <legend>Movie Information</legend>

        <p><label for="title">Title:</label>
           <input type="text" name="title" value="@title" /></p>

        <p><label for="genre">Genre:</label>
           <input type="text" name="genre" value="@genre" /></p>

        <p><label for="year">Year:</label>
           <input type="text" name="year" value="@year" /></p>

        <input type="hidden" name="movieid" value="@movieId" />

        <p><input type="submit" name="buttonSubmit" value="Submit Changes" /></p>
      </fieldset>
    </form>
    <p><a href="~/Movies">Return to movie listing</a></p>
  </body>
</html>

Recursos adicionais