Разработка сайта 101: Часть 8. Создание страницы удаления данных
<p style="text-align: justify; ">Итак, вы уже создавали управляемый список любимых фильмов, разрабатывали его, <a href="/information/razrabotka_sayta_101_chast_6_sozdanie_dobavlyayushchey_informatsionnoy_stranitsy/" >добавляли новые фильмы</a>и <a href="/information/razrabotka_sayta_101_chast_7_sozdanie_stranitsy_redaktirovaniya_dannykh/" >отредактировали существующие фильмы</a> в базе данных. Далее вы научитесь удалять записи из базы данных - это предпоследний шаг, а значит уже в следующем уроке мы завершим обучение по работе с WebMatrix!!!</p>
<p>Вы, возможно, слышали о термине CRUD применительно к разработке веб-приложений и к данным. Стандарты CRUD используются для Создания(Create), Получения(Retrieve), Обновления(Update), Удаления(Delete) данных. Всё это вы уже проделывали в WebMatrix.</p>
<h2>Добавление удаляющей страницы</h2>
<p style="text-align: justify; ">Для начала создайте новую страницу CSHTML и назовите ее DeleteMovie.cshtml.</p>
<p style="text-align: justify; ">Замените HTML-код на следующий:</p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "><h1>Delete a movie</h1> </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "><p>Are you sure you want to delete the movie <strong>@Movie.Name ?</strong></p> </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "><form action="" method="post"> <input type="submit" value="Yes"/> </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> <input type="button" value="No" onclick="window.location = 'dataMovies.cshtml'" /></form> </span></p>
<p style="text-align: justify; ">Эта часть кода создает основную форму, содержащую 2 кнопки: одна инициирует POST HTTP (точно так же, как страница редактирования в предыдущей главе), другая перенаправляет пользователя к списку фильмов.</p>
<p style="text-align: justify; ">Для удаления элемента эта страница точно так же, как страница EditMovie.cshtml вызывет и передаст параметр, которым будет являться ID фильма. Перед вами отобразится сообщение - «Are you sure you want to delete the movie @Movie.Name?» Значение Movie.Name вставит сервер, но серверу необходимо сообщить, как получить это значение.</p>
<p style="text-align: justify; ">Чтобы сделать это, как и прежде, поместите соответсвующий Razor-код сверху страницы, чтобы задействовать входной параметр.</p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 1: @{ </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 2: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 3: var id=Request["id"]; </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 4: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 5: var SQLSELECT = "SELECT * FROM Favorites where ID=@0"; </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 6: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 7: var db = Database.Open("Movies"); </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 8: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 9: var Movie = db.QuerySingle(SQLSELECT,id); </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 10: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 11: var MovieName=Movie.Name; </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 12: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 13: }</span></p>
<p style="text-align: justify; ">В этой части кода вы увидете, что параметр был передан странице в качестве «id» (с использованием DeleteMovie.cshtml?id=<whatever>), и он используется, чтобы найти определенный фильм. Запрос выполнен по отношению к базе данных, и соответствующая ему запись фильма была найдена. Теперь вы можете получить имя фильма, и найти фильм, когда страница будет отображена.</p>
<p style="text-align: justify; ">Попытайтесь выполнить DeleteMovie.cshtml?id=<something>, и на экране отобразится <something>, являющийся ID в вашей базе данных:</p>
<p><img src="/upload/medialibrary/7d4/7d4d2e17395a424db7d416de075a00ae.PNG" title="Создание удаляющей страницы данных" hspace="5" vspace="5" border="0" alt="Создание удаляющей страницы данных" width="700" height="386" /></p>
<p style="text-align: justify; ">Если вы нажмете кнопку «No», то будете перенаправлены назад к странице dataMovies.cshtml. Если нажимаете «Yes», то ничего не произойдет, потому что вы ещё не создали код, который произведёт удаление.</p>
<p style="text-align: justify; ">Для удаления записи из базы данных, используйте команду SQL DELETE. Она имеет следующий синтаксис: </p>
<p style="text-align: center; "><span style="background-color: rgb(215, 215, 215); ">DELETE FROM <Table> WHERE <Field>=<Value> </span></p>
<p style="text-align: justify; ">Так, если бы мы хотели удалить фильм с id=2, то мы могли бы написать:</p>
<p style="text-align: center; "><span style="background-color: rgb(215, 215, 215); ">DELETE FROM Favorites WHERE ID=2 </span></p>
<p style="text-align: justify; ">Когда пользователь нажмет кнопку «Yes», перед ним отобразится форма, и удаление не произойдет, но мы сможем легко сделать это следующим образом:</p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 1: if(IsPost){ </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 2: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 3: var SQLDELETE = "DELETE FROM Favorites WHERE ID=@0"; </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 4: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 5: db.Execute(SQLDELETE,id); </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 6: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 7: Response.Redirect("dataMovies.cshtml"); </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 8: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 9: }</span></p>
<p style="text-align: justify; ">Фильм удалится, и пользователь будет перенаправлен к странице со списком фильмов для просмотра результата.</p>
<p style="text-align: justify; ">Полный код для DeleteMovie.cshtml выглядит так:</p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 1: @{ </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 2: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 3: var id=Request["id"]; </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 4: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 5: var SQLSELECT = "SELECT * FROM Favorites where ID=@0"; </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 6: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 7: var db = Database.Open("Movies"); </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 8: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 9: var Movie = db.QuerySingle(SQLSELECT,id); </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 10: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 11: var MovieName=Movie.Name; </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 12: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 13: if(IsPost){ </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 14: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 15: var SQLDELETE = "DELETE FROM Favorites WHERE ID=@0"; </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 16: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 17: db.Execute(SQLDELETE,id); </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 18: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 19: Response.Redirect("dataMovies.cshtml"); </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 20: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 21: } </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 22: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 23: } </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 24: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 25: <h1>Delete a movie</h1> </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 26: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 27: <p>Are you sure you want to delete the movie <strong>@Movie.Name ?</strong></p> </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 28: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 29: <form action="" method="post"> </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 30: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 31: <p><input type="submit" value="Yes"/> </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 32: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 33: <input type="button" value="No" onclick="window.location = 'dataMovies.cshtml'" /></p> </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 34: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 35: <br/> </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 36: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 37: </form></span></p>
<h2 style="text-align: center; ">Вызов удаляющей страницы из списка фильмов</h2>
<p style="text-align: justify; ">Теперь, когда вы научились работать с удаляющей страницей, давайте соединим ее со страницей списка фильмов так, чтобы пользователь мог выбрать элемент из этого списка и удалить его.</p>
<p style="text-align: justify; ">На страницу списка фильмов мы просто должны добавить гиперссылку к каждой записи списка фильмов, где гиперссылка к странице DeleteMovie.cshtml передает идентификатор текущего фильма.</p>
<p style="text-align: justify; ">Полный код для dataMovies.cshtml выглядит так:</p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 1: @{ </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 2: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 3: var db= Database.Open("Movies"); </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 4: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 5: var sqlQ = "SELECT * FROM Favorites"; </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 6: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 7: var data = db.Query(sqlQ); </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 8: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 9: } </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 10: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 11: <div id="movieslist"> </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 12: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 13: <ol> </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 14: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 15: @foreach(var row in data){ </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 16: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 17: <li> </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 18: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 19: <a href="EditMovie.cshtml?id=@row.id">@row.Name, @row.Genre, @row.ReleaseYear </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 20: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 21: </a> </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 22: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 23: <a href="DeleteMovie.cshtml?id=@row.id">Delete</a> </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 24: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 25: </li> </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 26: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 27: } </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 28: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 29: </ol> </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 30: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 31: <a href="AddMovie.cshtml">Add a new movie</a> </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 32: </span></p>
<p style="text-align: justify; "><span style="background-color: rgb(225, 225, 225); "> 33: </div></span></p>
<p>Откройте эту страницу и увидите все возможные варианты для удаления:</p>
<p><img src="/upload/medialibrary/30b/30b58d60e80e79b327a089e4acb9eeb7.PNG" title="Создание удаляющей страницы данных" hspace="5" vspace="5" border="0" alt="Создание удаляющей страницы данных" width="700" height="472" /></p>
<p style="text-align: justify; ">Если вы теперь поставите удаляющую ссылку на каком-либо из этих фильмов, то перейдете к странице «Удаление фильма». До перехода на эту страницу перед вами отобразится сообщение: «Are you sure you want to delete the movie?».</p>
<p><img src="/upload/medialibrary/b2f/b2f4acb54ef0c0a12e9244c27ac937d0.PNG" title="Создание удаляющей страницы данных" hspace="5" vspace="5" border="0" alt="Создание удаляющей страницы данных" width="700" height="472" /></p>
<p style="text-align: justify; ">Если вы нажмете «No», то будете возвращены к списку фильмов. Если нажмете «Yes», то будете возвращены к списку, и фильм удалится. Вот что будет, если нажмете «Yes»:</p>
<p><img src="/upload/medialibrary/246/246bb59db845453e312436cbffadbb89.PNG" title="Создание удаляющей страницы данных" hspace="5" vspace="5" border="0" alt="Создание удаляющей страницы данных" width="700" height="472" /></p>
<h2 style="text-align: center; ">Заключение</h2>
<p style="text-align: justify; ">Поздравляем! Вы создали полное приложение, которое имеет функциональность Создания(Create), Получения(Retrieve), Обновления(Update), Удаления(Delete) данных, и которое использует серверный код, чтобы динамически генерировать HTML. Не так страшен черт как его малюют!</p>
<p style="text-align: justify; ">Более подробную информацию о синтаксисе Razor, и о создании приложения с его помощью вы можете узнать здесь <noindex><a href="http://www.asp.net/webmatrix/fundamentals" rel="nofollow" >http://www.asp.net/webmatrix/fundamentals</a></noindex>.</p>
<p style="text-align: justify; ">В следующем, заключительном шаге вы опубликуете свою работу в Интернет и увидете, как с помощью WebMatrix вы сможете сохранить свою разработку, а сервер выполнит синхронизацию!</p>
<p style="text-align: justify; "><font color="#00a650">И помните - я продемонстрировал прямые обращения к базе данных - это не всегда безопасный и эффективный метод работы с БД, если вы новичок. Используйте инструменты того фреймфорка или CMS, на котором работает ваш сайт, и только в случае отсутствия оного прибегайте к прямым запросам, но <b>будьте крайне осторожны с ними</b>!!!</font></p>
<p>
<br />
</p>
<p style="text-align: right; ">16 января 2012</p>
<p style="text-align: right; ">Задойный А.В.</p>