Общие сведения о работе с базой данных на сайтах веб-страницы ASP.NET (Razor)
; автор — Том ФитцМакен (Tom FitzMacken)
В этой статье описывается, как использовать средства Microsoft WebMatrix для создания базы данных на веб-сайте веб-страницы ASP.NET (Razor), а также как создавать страницы, позволяющие отображать, добавлять, изменять и удалять данные.
Из этого руководства вы узнаете, как выполнять такие задачи:
- Создание базы данных.
- Как подключиться к базе данных.
- Отображение данных на веб-странице.
- Вставка, обновление и удаление записей базы данных.
Ниже приведены функции, представленные в этой статье:
- Работа с базой данных Microsoft SQL Server Compact Edition.
- Работа с SQL-запросами.
- Класс
Database
.Версии программного обеспечения, используемые в этом руководстве
- веб-страницы ASP.NET (Razor) 2
- WebMatrix 2
Это руководство также работает с WebMatrix 3. Вы можете использовать веб-страницы ASP.NET 3 и Visual Studio 2013 (или Visual Studio Express 2013 для Web). Однако пользовательский интерфейс будет отличаться.
Общие сведения о базах данных
Представьте себе типичную адресную книгу. Для каждой записи в адресной книге (т. е. для каждого человека) у вас есть несколько элементов информации, таких как имя, фамилия, адрес, адрес электронной почты и номер телефона.
Типичный способ изображения таких данных — таблица со строками и столбцами. В терминах базы данных каждую строку часто называют записью. Каждый столбец (иногда называемый полями) содержит значение для каждого типа данных: имя, фамилия и т. д.
Идентификатор | FirstName | LastName | Адрес | Электронная почта | Номер телефона |
---|---|---|---|---|---|
1 | Артем | Абрус | 210 100-й Санкт-СЕ Косатки WA 98031 | jim@contoso.com | 555 0100 |
2 | Terry | Адамс (Adams) | 1234 Main St. Seattle WA 99011 | terry@cohowinery.com | 555 0101 |
Для большинства таблиц базы данных таблица должна содержать столбец, содержащий уникальный идентификатор, например номер клиента, номер счета и т. д. Это называется первичным ключом таблицы, и он используется для идентификации каждой строки в таблице. В этом примере столбец id является первичным ключом адресной книги.
Благодаря этому базовому пониманию баз данных вы можете научиться создавать простую базу данных и выполнять такие операции, как добавление, изменение и удаление данных.
Совет
Реляционные базы данных
Вы можете хранить данные различными способами, включая текстовые файлы и электронные таблицы. Однако для большинства бизнес-применений данные хранятся в реляционной базе данных.
В этой статье не подробно рассматриваются базы данных. Тем не менее, вам может быть полезно понять немного о них. В реляционной базе данных сведения логически делятся на отдельные таблицы. Например, база данных для учебного заведения может содержать отдельные таблицы для учащихся и предложений классов. Программное обеспечение базы данных (например, SQL Server) поддерживает мощные команды, позволяющие динамически устанавливать связи между таблицами. Например, с помощью реляционной базы данных можно установить логическую связь между учащимися и классами, чтобы создать расписание. Хранение данных в отдельных таблицах снижает сложность структуры таблицы и снижает необходимость хранения избыточных данных в таблицах.
Создание базы данных
В этой процедуре показано, как создать базу данных с именем SmallBakery с помощью средства проектирования базы данных SQL Server Compact, включенного в WebMatrix. Хотя базу данных можно создать с помощью кода, более типично создавать базу данных и таблицы базы данных с помощью средства проектирования, такого как WebMatrix.
Запустите WebMatrix и на странице Быстрого запуска щелкните Сайт из шаблона.
Выберите Пустой сайт и в поле Имя сайта введите "SmallBakery" и нажмите кнопку ОК. Сайт создается и отображается в WebMatrix.
В левой области щелкните рабочую область Базы данных .
На ленте щелкните Создать базу данных. Создается пустая база данных с тем же именем, что и у сайта.
В левой области разверните узел SmallBakery.sdf и щелкните Таблицы.
На ленте щелкните Создать таблицу. WebMatrix открывает конструктор таблиц.
Щелкните столбец Имя и введите "Id".
В столбце Тип данных выберите int.
Задайте для параметров Первичный ключ? и Является ли определение? значение Да.
Как следует из названия, Параметр Является первичным ключом сообщает базе данных, что это будет первичный ключ таблицы. Указывает , что база данных автоматически создает идентификационный номер для каждой новой записи и назначает ему следующий последовательный номер (начиная с 1).
Щелкните следующую строку. Редактор запускает новое определение столбца.
В поле Имя введите "Имя".
В поле Тип данных выберите "nvarchar" и задайте длину 50. Часть
nvarchar
var сообщает базе данных, что данные для этого столбца будут строкой, размер которой может отличаться от записи к записи. (Префикс n представляет national, указывая, что поле может содержать символьные данные, представляющие любой алфавит или систему письма, то есть, что поле содержит данные Юникода.)Задайте для параметра Разрешить значения NULL значение Нет. Это приведет к тому, что столбец Name не останется пустым.
С помощью этого же процесса создайте столбец с именем Description. Задайте для параметра Тип данных значение nvarchar и 50 для длины, а для параметра Allow Nulls задайте значение false.
Создайте столбец с именем Price. Задайте для параметра Тип данных значение money , а для параметра Allow Nulls задайте значение false.
В поле в верхней части назовите таблицу "Product".
Когда все будет готово, определение будет выглядеть следующим образом:
Нажмите клавиши CTRL+S, чтобы сохранить таблицу.
Добавление данных в базу данных
Теперь вы можете добавить некоторые примеры данных в базу данных, с которыми вы будете работать далее в этой статье.
В левой области разверните узел SmallBakery.sdf и щелкните Таблицы.
Щелкните правой кнопкой мыши таблицу Product и выберите пункт Данные.
В области редактирования введите следующие записи:
имя; Описание Цена Хлеб Запеченный свежий каждый день. 2,99 Клубничный короткий кейк Сделано с органической клубникой из нашего сада. 9,99 Apple Pie Уступает только пирогу вашей мамы. 12,99 Пекан Пирог Если вы любите пекан, это для вас. 10.99 Лимонный пирог Сделано с лучшими лимонами в мире. 11.99 Кексы Ваши дети и ребенок в вас будут любить эти. 7,99 Помните, что вам не нужно вводить ничего для столбца Id . При создании столбца Id для его свойства Is Identity задается значение true, что приводит к автоматическому заполнению столбца.
После ввода данных конструктор таблиц будет выглядеть следующим образом:
Закройте вкладку, содержащую данные базы данных.
Отображение данных из базы данных
Получив базу данных с данными, вы можете отобразить их на веб-странице ASP.NET. Чтобы выбрать отображаемые строки таблицы, используйте инструкцию SQL, которая является командой, передаваемой в базу данных.
В левой области щелкните рабочую область Файлы .
В корне веб-сайта создайте страницу CSHTML с именем ListProducts.cshtml.
Замените существующую разметку следующей:
@{ var db = Database.Open("SmallBakery"); var selectQueryString = "SELECT * FROM Product ORDER BY Name"; } <!DOCTYPE html> <html> <head> <title>Small Bakery Products</title> <style> table, th, td { border: solid 1px #bbbbbb; border-collapse: collapse; padding: 2px; } </style> </head> <body> <h1>Small Bakery Products</h1> <table> <thead> <tr> <th>Id</th> <th>Product</th> <th>Description</th> <th>Price</th> </tr> </thead> <tbody> @foreach(var row in db.Query(selectQueryString)){ <tr> <td>@row.Id</td> <td>@row.Name</td> <td>@row.Description</td> <td>@row.Price</td> </tr> } </tbody> </table> </body> </html>
В первом блоке кода открывается созданный ранее файл SmallBakery.sdf (база данных). Метод
Database.Open
предполагает, что SDF-файл находится в папке App_Data веб-сайта. (Обратите внимание, что вам не нужно указывать расширение SDF — на самом деле, если вы это сделаете,Open
метод не будет работать.)Примечание
Папка App_Data — это специальная папка в ASP.NET, которая используется для хранения файлов данных. Дополнительные сведения см. в разделе Подключение к базе данных далее в этой статье.
Затем выполняется запрос на запрос к базе данных с помощью следующей инструкции SQL
Select
:SELECT * FROM Product ORDER BY Name
В инструкции определяет таблицу для
Product
запроса. Символ*
указывает, что запрос должен возвращать все столбцы из таблицы. (Можно также перечислить столбцы по отдельности, разделенные запятыми, если вы хотите видеть только некоторые столбцы.) ПредложениеOrder By
указывает, как следует отсортировать данные — в данном случае по столбцу Имя . Это означает, что данные сортируются в алфавитном порядке на основе значения столбца Name для каждой строки.В тексте страницы разметка создает HTML-таблицу, которая будет использоваться для отображения данных.
<tbody>
Внутри элемента используетсяforeach
цикл, чтобы по отдельности получить каждую строку данных, возвращаемую запросом. Для каждой строки данных создается строка таблицы HTML (<tr>
элемент ). Затем вы создадите ячейки таблицы HTML (<td>
элементы) для каждого столбца. При каждом прохождении цикла следующая доступная строка из базы данных находится в переменнойrow
(вы настраиваете ее в инструкцииforeach
). Чтобы получить отдельный столбец из строки, можно использоватьrow.Name
илиrow.Description
или любое имя нужного столбца.Запустите страницу в браузере. (Перед запуском убедитесь, что страница выбрана в рабочей области Файлы .) На странице отображается список, подобный следующему:
Совет
Язык SQL
SQL — это язык, который используется в большинстве реляционных баз данных для управления данными в базе данных. Он включает команды, которые позволяют извлекать и обновлять данные, а также создавать, изменять и администрировать таблицы базы данных. SQL отличается от языка программирования (например, который вы используете в WebMatrix), так как в SQL идея заключается в том, что вы сообщаете базе данных, что хотите, и это задача базы данных — выяснить, как получить данные или выполнить задачу. Ниже приведены примеры некоторых команд SQL и их назначение.
SELECT Id, Name, Price FROM Product WHERE Price > 10.00 ORDER BY Name
При этом столбцы Id, Name и Price извлекается из записей в таблице Product , если значение Price больше 10, и возвращает результаты в алфавитном порядке на основе значений столбца Name . Эта команда возвращает результирующий набор, содержащий записи, соответствующие условиям, или пустой набор, если записи не совпадают.
INSERT INTO Product (Name, Description, Price) VALUES ("Croissant", "A flaky delight", 1.99)
При этом в таблицу Product вставляется новая запись, задав для столбца Имя значение "Круассан", для столбца "Описание " значение "A flaky delight" и для значения цены значение 1,99.
DELETE FROM Product WHERE ExpirationDate < "01/01/2008"
Эта команда удаляет записи в таблице Product , столбец даты окончания срока действия которых раньше 1 января 2008 г. (При этом предполагается, что в таблице Product есть такой столбец, конечно.) Дата вводится здесь в формате ММ/ДД/ГГГГ, но она должна быть введена в формате, который используется для вашего языкового стандарта.
Команды Insert Into
и Delete
не возвращают результирующие наборы. Вместо этого они возвращают число, указывающее, сколько записей было затронуто командой .
Для некоторых из этих операций (например, вставки и удаления записей) процесс, запрашивающий операцию, должен иметь соответствующие разрешения в базе данных. Именно поэтому для рабочих баз данных часто требуется указывать имя пользователя и пароль при подключении к базе данных.
Существуют десятки команд SQL, но все они следуют следующему шаблону. Команды SQL можно использовать для создания таблиц базы данных, подсчета количества записей в таблице, вычисления цен и выполнения многих других операций.
Вставка данных в базу данных
В этом разделе показано, как создать страницу, которая позволяет пользователям добавлять новый продукт в таблицу базы данных Product . После вставки новой записи продукта на странице отображается обновленная таблица с помощью страницы ListProducts.cshtml , созданной в предыдущем разделе.
Страница включает проверку, чтобы убедиться, что данные, вводимые пользователем, являются допустимыми для базы данных. Например, код на странице гарантирует, что для всех обязательных столбцов введено значение.
На веб-сайте создайте файл CSHTML с именем InsertProducts.cshtml.
Замените существующую разметку следующей:
@{ Validation.RequireField("Name", "Product name is required."); Validation.RequireField("Description", "Product description is required."); Validation.RequireField("Price", "Product price is required."); var db = Database.Open("SmallBakery"); var Name = Request.Form["Name"]; var Description = Request.Form["Description"]; var Price = Request.Form["Price"]; if (IsPost && Validation.IsValid()) { // Define the insert query. The values to assign to the // columns in the Product table are defined as parameters // with the VALUES keyword. if(ModelState.IsValid) { var insertQuery = "INSERT INTO Product (Name, Description, Price) " + "VALUES (@0, @1, @2)"; db.Execute(insertQuery, Name, Description, Price); // Display the page that lists products. Response.Redirect("~/ListProducts"); } } } <!DOCTYPE html> <html> <head> <title>Add Products</title> <style type="text/css"> label {float:left; width: 8em; text-align: right; margin-right: 0.5em;} fieldset {padding: 1em; border: 1px solid; width: 50em;} legend {padding: 2px 4px; border: 1px solid; font-weight:bold;} .validation-summary-errors {font-weight:bold; color:red; font-size: 11pt;} </style> </head> <body> <h1>Add New Product</h1> @Html.ValidationSummary("Errors with your submission:") <form method="post" action=""> <fieldset> <legend>Add Product</legend> <div> <label>Name:</label> <input name="Name" type="text" size="50" value="@Name" /> </div> <div> <label>Description:</label> <input name="Description" type="text" size="50" value="@Description" /> </div> <div> <label>Price:</label> <input name="Price" type="text" size="50" value="@Price" /> </div> <div> <label> </label> <input type="submit" value="Insert" class="submit" /> </div> </fieldset> </form> </body> </html>
Текст страницы содержит HTML-форму с тремя текстовыми полями, которые позволяют пользователям ввести имя, описание и цену. Когда пользователи нажимают кнопку Вставка , код в верхней части страницы открывает подключение к базе данных SmallBakery.sdf . Затем вы получите значения, отправленные пользователем с помощью объекта ,
Request
и назначьте их локальным переменным.Чтобы убедиться, что пользователь ввел значение для каждого обязательного столбца, необходимо зарегистрировать каждый
<input>
элемент, который требуется проверить:Validation.RequireField("Name", "Product name is required."); Validation.RequireField("Description", "Product description is required."); Validation.RequireField("Price", "Product price is required.");
Помощник
Validation
проверяет наличие значения в каждом зарегистрированном поле. Вы можете проверить, прошли ли все поля проверку, проверивValidation.IsValid()
, что обычно делается перед обработкой сведений, полученных от пользователя:if (IsPost && Validation.IsValid()) { // Process information here }
(Оператор
&&
означает И — этот тест имеет значение , если это отправка формы И все поля прошли проверку.)Если все столбцы проверены (ни один из них не был пустым), создайте инструкцию SQL для вставки данных, а затем выполните ее, как показано ниже:
var insertQuery = "INSERT INTO Product (Name, Description, Price) VALUES (@0, @1, @2)";
Для вставляемых значений необходимо включить заполнители параметров (
@0
,@1
,@2
).Примечание
В качестве меры безопасности всегда передайте значения в инструкцию SQL с помощью параметров, как показано в предыдущем примере. Это дает возможность проверить данные пользователя, а также помогает защититься от попыток отправки вредоносных команд в базу данных (иногда называемых атаками путем внедрения кода SQL).
Чтобы выполнить запрос, используйте следующую инструкцию, передавая ей переменные, содержащие значения для замены заполнителей:
db.Execute(insertQuery, Name, Description, Price);
После выполнения инструкции
Insert Into
пользователь отправляется на страницу со списком продуктов с помощью этой строки:Response.Redirect("~/ListProducts");
Если проверка не выполнена, вставку можно пропустить. Вместо этого на странице есть вспомогательный помощник, который может отображать накопленные сообщения об ошибках (если таковые имеются):
@Html.ValidationSummary("Errors with your submission:")
Обратите внимание, что блок стилей в разметке содержит определение класса CSS с именем
.validation-summary-errors
. Это имя класса CSS, используемого по умолчанию для<div>
элемента, содержащего ошибки проверки. В этом случае класс CSS указывает, что сводные ошибки проверки отображаются красным и полужирным шрифтом, но вы можете определить.validation-summary-errors
класс для отображения любого нужного форматирования.
Тестирование страницы вставки
Просмотр страницы в браузере. На странице отображается форма, похожая на ту, которая показана на следующем рисунке.
Введите значения для всех столбцов, но не забудьте оставить столбец Цена пустым.
Нажмите кнопку Вставить. На странице отображается сообщение об ошибке, как показано на следующем рисунке. (Новая запись не создается.)
Заполните форму полностью и нажмите кнопку Вставить. На этот раз отобразится страница ListProducts.cshtml , на котором отображается новая запись.
Обновление данных в базе данных
После ввода данных в таблицу может потребоваться обновить их. В этой процедуре показано, как создать две страницы, похожие на страницы, созданные ранее для вставки данных. На первой странице отображаются продукты и пользователи могут выбрать один из них для изменения. Вторая страница позволяет пользователям вносить изменения и сохранять их.
Примечание
Важно На рабочем веб-сайте обычно ограничивается, кому разрешено вносить изменения в данные. Сведения о настройке членства и способах авторизации пользователей для выполнения задач на сайте см. в статье Добавление безопасности и членства на сайт веб-страницы ASP.NET.
На веб-сайте создайте новый CSHTML-файл с именем EditProducts.cshtml.
Замените существующую разметку в файле следующим кодом:
@{ var db = Database.Open("SmallBakery"); var selectQueryString = "SELECT * FROM Product ORDER BY Name"; } <!DOCTYPE html> <html> <head> <title>Edit Products</title> <style type="text/css"> table, th, td { border: solid 1px #bbbbbb; border-collapse: collapse; padding: 2px; } </style> </head> <body> <h1>Edit Small Bakery Products</h1> <table> <thead> <tr> <th> </th> <th>Name</th> <th>Description</th> <th>Price</th> </tr> </thead> <tbody> @foreach (var row in db.Query(selectQueryString)) { <tr> <td><a href="@Href("~/UpdateProducts", row.Id)">Edit</a></td> <td>@row.Name</td> <td>@row.Description</td> <td>@row.Price</td> </tr> } </tbody> </table> </body> </html>
Единственное отличие этой страницы от страницы ListProducts.cshtml от предыдущей заключается в том, что html-таблица на этой странице содержит дополнительный столбец, отображающий ссылку Изменить . Щелкнув эту ссылку, вы перейдете на страницу UpdateProducts.cshtml (которую вы создадите далее), где можно изменить выбранную запись.
Просмотрите код, создающий ссылку Изменить :
<a href="@Href("~/UpdateProducts", row.Id)">Edit</a></td>
При этом создается элемент HTML
<a>
, атрибут которогоhref
задается динамически. Атрибутhref
указывает страницу, отображаемую при щелчке по ссылке. Он также передаетId
значение текущей строки в ссылку. При запуске страницы источник страницы может содержать следующие ссылки:<a href="UpdateProducts/1">Edit</a></td> <a href="UpdateProducts/2">Edit</a></td> <a href="UpdateProducts/3">Edit</a></td>
Обратите внимание, что
href
атрибут имеет значениеUpdateProducts/n
, где n — это номер продукта. Когда пользователь щелкает одну из этих ссылок, результирующий URL-адрес будет выглядеть примерно так:http://localhost:18816/UpdateProducts/6
Иными словами, номер продукта, который необходимо изменить, будет передан в URL-адресе.
Просмотр страницы в браузере. На странице отображаются данные в следующем формате:
Далее вы создадите страницу, которая позволяет пользователям обновлять данные. Страница обновления содержит проверку для проверки данных, которые вводит пользователь. Например, код на странице гарантирует, что для всех обязательных столбцов введено значение.
На веб-сайте создайте новый CSHTML-файл с именем UpdateProducts.cshtml.
Замените существующую разметку в файле следующим кодом.
@{ Validation.RequireField("Name", "Product name is required."); Validation.RequireField("Description", "Product description is required."); Validation.RequireField("Price", "Product price is required."); var Name = ""; var Description = ""; var Price = Decimal.Zero; var ProductId = UrlData[0]; if (ProductId.IsEmpty()) { Response.Redirect("~/EditProducts"); } var db = Database.Open("SmallBakery"); if (IsPost && Validation.IsValid()) { var updateQueryString = "UPDATE Product SET Name=@0, Description=@1, Price=@2 WHERE Id=@3" ; Name = Request["Name"]; Description = Request["Description"]; Price = Request["Price"].AsDecimal(); db.Execute(updateQueryString, Name, Description, Price, ProductId); Response.Redirect(@Href("~/EditProducts")); } else { var selectQueryString = "SELECT * FROM Product WHERE Id=@0"; var row = db.QuerySingle(selectQueryString, ProductId); Name = row.Name; Description = row.Description; Price = row.Price; } } <!DOCTYPE html> <html> <head> <title>Add Products</title> <style type="text/css"> label { float: left; width: 8em; text-align: right; margin-right: 0.5em;} fieldset { padding: 1em; border: 1px solid; width: 35em;} legend { padding: 2px 4px; border: 1px solid; font-weight: bold;} .validation-summary-errors {font-weight:bold; color:red; font-size:11pt;} </style> </head> <body> <h1>Update Product</h1> @Html.ValidationSummary("Errors with your submission:") <form method="post" action=""> <fieldset> <legend>Update Product</legend> <div> <label>Name:</label> <input name="Name" type="text" size="50" value="@Name" /> </div> <div> <label>Description:</label> <input name="Description" type="text" size="50" value="@Description" /> </div> <div> <label>Price:</label> <input name="Price" type="text" size="50" value="@Price" /> </div> <div> <label> </label> <input type="submit" value="Update" class="submit" /> </div> </fieldset> </form> </body> </html>
Текст страницы содержит HTML-форму, в которой отображается продукт и где пользователи могут его редактировать. Чтобы отобразить продукт, используйте следующую инструкцию SQL:
SELECT * FROM Product WHERE Id=@0
При этом будет выбран продукт, идентификатор которого соответствует значению, передаваемого в параметре
@0
. (Так как id является первичным ключом и поэтому должен быть уникальным, таким образом можно выбрать только одну запись продукта.) Чтобы получить значение идентификатора, передаваемое в этуSelect
инструкцию, можно прочитать значение, передаваемое на страницу как часть URL-адреса, используя следующий синтаксис:var ProductId = UrlData[0];
Чтобы получить запись продукта, используйте
QuerySingle
метод , который возвращает только одну запись:var row = db.QuerySingle(selectQueryString, ProductId);
Одна строка возвращается в переменную
row
. Вы можете получить данные из каждого столбца и назначить их локальным переменным следующим образом:var Name = row.Name; var Description = row.Description; var Price = row.Price;
В разметке для формы эти значения автоматически отображаются в отдельных текстовых полях с помощью внедренного кода, как показано ниже:
<input name="Name" type="text" size="50" value="@Name" />
В этой части кода отображается обновляемая запись продукта. После отображения записи пользователь может изменять отдельные столбцы.
Когда пользователь отправляет форму, нажимая кнопку Обновить , выполняется код в блоке
if(IsPost)
. Он получает значения пользователя изRequest
объекта , сохраняет их в переменных и проверяет заполнение каждого столбца. Если проверка пройдена, код создает следующую инструкцию Обновления SQL:UPDATE Product SET Name=@0, Description=@1, Price=@2, WHERE ID=@3
В инструкции SQL
Update
необходимо указать каждый обновляющийся столбец и значение, которое необходимо задать для него. В этом коде значения задаются с помощью заполнителей@0
параметров ,@1
,@2
и т. д. (Как отмечалось ранее, для обеспечения безопасности всегда следует передавать значения в инструкцию SQL с помощью параметров.)При вызове
db.Execute
метода передаются переменные, содержащие значения в порядке, соответствующем параметрам в инструкции SQL:db.Execute(updateQueryString, Name, Description, Price, ProductId);
После выполнения инструкции
Update
вызовите следующий метод, чтобы перенаправить пользователя обратно на страницу редактирования:Response.Redirect(@Href("~/EditProducts"));
В результате пользователь видит обновленный список данных в базе данных и может редактировать другой продукт.
Сохраните страницу.
Запустите страницу EditProducts.cshtml (не страницу обновления) и нажмите кнопку Изменить , чтобы выбрать продукт для редактирования. Отобразится страница UpdateProducts.cshtml с выбранной записью.
Внесите изменения и нажмите кнопку Обновить. Список продуктов снова отображается с обновленными данными.
Удаление данных в базе данных
В этом разделе показано, как разрешить пользователям удалять продукт из таблицы базы данных product . Пример состоит из двух страниц. На первой странице пользователи выбирают запись для удаления. Затем запись, которую нужно удалить, отображается на второй странице, которая позволяет им подтвердить, что они хотят удалить запись.
Примечание
Важно На рабочем веб-сайте обычно ограничивается, кому разрешено вносить изменения в данные. Сведения о том, как настроить членство и как авторизовать пользователя для выполнения задач на сайте, см. в статье Добавление безопасности и членства на веб-страницы ASP.NET сайт.
На веб-сайте создайте файл CSHTML с именем ListProductsForDelete.cshtml.
Замените существующую разметку следующей:
@{ var db = Database.Open("SmallBakery"); var selectQueryString = "SELECT * FROM Product ORDER BY Name"; } <!DOCTYPE html> <html> <head> <title>Delete a Product</title> <style> table, th, td { border: solid 1px #bbbbbb; border-collapse: collapse; padding: 2px; } </style> </head> <body> <h1>Delete a Product</h1> <form method="post" action="" name="form"> <table border="1"> <thead> <tr> <th> </th> <th>Name</th> <th>Description</th> <th>Price</th> </tr> </thead> <tbody> @foreach (var row in db.Query(selectQueryString)) { <tr> <td><a href="@Href("~/DeleteProduct", row.Id)">Delete</a></td> <td>@row.Name</td> <td>@row.Description</td> <td>@row.Price</td> </tr> } </tbody> </table> </form> </body> </html>
Эта страница аналогична предыдущей странице EditProducts.cshtml . Однако вместо отображения ссылки Изменить для каждого продукта отображается ссылка Удалить . Ссылка "Удалить " создается с помощью следующего внедренного кода в разметке:
<a href="@Href("~/DeleteProduct", row.Id)">Delete</a>
При этом создается URL-адрес, который выглядит следующим образом, когда пользователь щелкает ссылку:
http://<server>/DeleteProduct/4
URL-адрес вызывает страницу с именем DeleteProduct.cshtml (которую вы создадите далее) и передает ей идентификатор продукта для удаления (здесь: 4).
Сохраните файл, но оставьте его открытым.
Создайте еще один файл CHTML с именем DeleteProduct.cshtml. Замените существующее содержимое следующим:
@{ var db = Database.Open("SmallBakery"); var ProductId = UrlData[0]; if (ProductId.IsEmpty()) { Response.Redirect("~/ListProductsForDelete"); } var prod = db.QuerySingle("SELECT * FROM PRODUCT WHERE ID = @0", ProductId); if( IsPost && !ProductId.IsEmpty()) { var deleteQueryString = "DELETE FROM Product WHERE Id=@0"; db.Execute(deleteQueryString, ProductId); Response.Redirect("~/ListProductsForDelete"); } } <!DOCTYPE html> <html> <head> <title>Delete Product</title> </head> <body> <h1>Delete Product - Confirmation</h1> <form method="post" action="" name="form"> <p>Are you sure you want to delete the following product?</p> <p>Name: @prod.Name <br /> Description: @prod.Description <br /> Price: @prod.Price</p> <p><input type="submit" value="Delete" /></p> </form> </body> </html>
Эта страница вызывается listProductsForDelete.cshtml и позволяет пользователям подтвердить, что они хотят удалить продукт. Чтобы получить список удаляемого продукта, вы получите идентификатор удаляемого продукта из URL-адреса с помощью следующего кода:
var ProductId = UrlData[0];
Затем страница предлагает пользователю нажать кнопку, чтобы фактически удалить запись. Это важная мера безопасности: при выполнении конфиденциальных операций на веб-сайте, таких как обновление или удаление данных, эти операции всегда должны выполняться с помощью операции POST, а не get. Если сайт настроен таким образом, что операция удаления может быть выполнена с помощью операции GET, любой пользователь может передать URL-адрес, например
http://<server>/DeleteProduct/4
, и удалить из вашей базы данных все, что нужно. Добавив подтверждение и закодив страницу, чтобы удаление можно было выполнить только с помощью POST, вы добавляете меру безопасности на свой сайт.Фактическая операция удаления выполняется с помощью следующего кода, который сначала подтверждает, что это операция после операции и что идентификатор не пуст:
if( IsPost && !ProductId.IsEmpty()) { var deleteQueryString = "DELETE FROM Product WHERE Id=@0"; db.Execute(deleteQueryString, ProductId); Response.Redirect("~/ListProductsForDelete"); }
Код выполняет инструкцию SQL, которая удаляет указанную запись, а затем перенаправляет пользователя обратно на страницу со списком.
Запустите ListProductsForDelete.cshtml в браузере.
Щелкните ссылку Удалить для одного из продуктов. Отобразится страница DeleteProduct.cshtml , чтобы подтвердить удаление этой записи.
Нажмите кнопку Удалить. Запись продукта удаляется, а страница обновляется с обновленным описанием продукта.
Совет
Соединение с базой данных
Подключиться к базе данных можно двумя способами. Первый — использовать Database.Open
метод и указать имя файла базы данных (за вычетом расширения SDF ):
var db = Database.Open("SmallBakery");
Метод Open
предполагает, что объект .SDF-файл находится в папке App_Data веб-сайта. Эта папка предназначена специально для хранения данных. Например, он имеет соответствующие разрешения, позволяющие веб-сайту считывать и записывать данные, а в качестве меры безопасности WebMatrix не разрешает доступ к файлам из этой папки.
Второй способ — использовать строку подключения. Строка подключения содержит сведения о том, как подключиться к базе данных. Это может быть путь к файлу или имя базы данных SQL Server на локальном или удаленном сервере, а также имя пользователя и пароль для подключения к этому серверу. (Если данные хранятся в централизованно управляемой версии SQL Server, например на сайте поставщика услуг размещения, вы всегда используете строку подключения для указания сведений о подключении к базе данных.)
В WebMatrix строки подключения обычно хранятся в XML-файле с именемWeb.config. Как следует из названия, вы можете использовать файлWeb.config в корне веб-сайта для хранения сведений о конфигурации сайта, включая любые строки подключения, которые могут потребоваться вашему сайту. Пример строки подключения в файлеWeb.config может выглядеть следующим образом. Примечание $CREDENTIAL_PLACEHOLDER$
— это заполнитель для пары "ключ-значение" пароля:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add
name="SQLServerConnectionString"
connectionString= "server=myServer;database=myDatabase;uid=username;$CREDENTIAL_PLACEHOLDER$"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
В этом примере строка подключения указывает на базу данных в экземпляре SQL Server, который выполняется где-то на сервере (в отличие от локального SDF-файла). Необходимо заменить соответствующие имена для myServer
и myDatabase
, а также указать SQL Server значения входа для username
и password
. (Значения имени пользователя и пароля не обязательно совпадают с вашими учетными данными Windows или значениями, предоставленными поставщиком услуг размещения для входа на свои серверы. Обратитесь к администратору за точными значениями.)
Метод Database.Open
является гибким, так как позволяет передать имя SDF-файла базы данных или имя строки подключения, хранящейся в файлеWeb.config . В следующем примере показано, как подключиться к базе данных с помощью строки подключения, показанной в предыдущем примере:
@{
var db = Database.Open("SQLServerConnectionString");
}
Как уже отмечалось, Database.Open
метод позволяет передать имя базы данных или строку подключения и выяснить, какие из них следует использовать. Это очень полезно при развертывании (публикации) веб-сайта. SDF-файл можно использовать в папке App_Data при разработке и тестировании сайта. Затем при перемещении сайта на рабочий сервер можно использовать строку подключения в файлеWeb.config , имя которого совпадает с именем SDF-файла , но указывающее на базу данных поставщика услуг размещения. Все это без необходимости изменения кода.
Наконец, если вы хотите работать непосредственно со строкой подключения, можно вызвать Database.OpenConnectionString
метод и передать ему фактическую строку подключения, а не только имя в файлеWeb.config . Это может быть полезно в ситуациях, когда по какой-либо причине у вас нет доступа к строке подключения (или значениям в ней, таким как имя SDF-файла ), пока страница не будет запущена. Однако в большинстве сценариев можно использовать Database.Open
, как описано в этой статье.