Опубликован: 15.06.2011 | Доступ: свободный | Студентов: 701 / 55 | Оценка: 4.25 / 4.00 | Длительность: 14:09:00
Самостоятельная работа 4:

Web Matrix. Работа с данным

Редактирование записей в базе данных

1.В текущем проекте создадим CSHTML файл, и назовем его EditProducts.cshtml:

2.Заменим исходный код страницы 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, созданной ранее, но отличается колонкой с динамически - генерируемыми ссылками на страницу редактирования записей (её мы создадим позднее).

3.Запустим приложение, в результате откроется окно браузера со следующим содержанием:

Ссылки, в первой колонке, будут иметь вид:

http://localhost:28163/UpdateProducts/n

где localhost:28163адрес сервера , UpdateProducts страница редактирования , n - номер продукта, который соответствует значению столбца id в базе данных.

4.В текущем проекте создадим CSHTML файл, и назовем его UpdateProducts.cshtml:

5.Заменим исходный код страницы UpdateProducts.cshtml на:

@{
    var db = Database.Open("SmallBakery");
    var selectQueryString = "SELECT * FROM Product WHERE id=@0";
    var productId  = UrlData[0];
     
    if (productId.IsEmpty()) 
     {
         Response.Redirect(@Href("/EditProducts"));
     } 
     
    var row = db.QuerySingle(selectQueryString, productId);
    var name = row.name;
    var description = row.description;
    var price = row.price;
     
    if (IsPost) 
        {
        name = Request["Name"];
        if (String.IsNullOrEmpty(name)) 
        {
           ModelState.AddError("Name", "Product name is required.");
        }
 
        description = Request["Description"];
        if (String.IsNullOrEmpty(description)) 
         {
          ModelState.AddError("Description", 
                "Product description is required.");
         }
         

        price = Request["Price"];
        if (String.IsNullOrEmpty(price)) 
        {
          ModelState.AddError("Price", "Product price is required.");
        }        
 price = Request["price"];
        if (price.IsEmpty()) {
          ModelState.AddError("Price", "Product price is required.");
        }
 
        if(ModelState.IsValid) 
{
            var updateQueryString = 
              "UPDATE Product SET name=@0, description=@1, price=@2 WHERE id=@3" ;
            db.Execute(updateQueryString, name, description, price, productId);
            Response.Redirect(@Href("/EditProducts"));
        }
    }
}

<!DOCTYPE html>
<html>
<head>
    <title>Update Product</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;}
    </style>
</head>
<body>
    <h1>Update Product</h1>
      
    @Html.ValidationSummary()
     
    <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>

Тег <body></body> содержит HTML форму, в которой будет отображаться результаты SQL запроса с параметром:
SELECT * FROM Product WHERE id=@0

Значение параметра будет браться из URL ссылки:

var productId = UrlData[0];

Проверим, содержит ли переменная productId, значения, если нет, то переадресация на страницу EditProducts.cshtml:

if (productId.IsEmpty()) 
     {
         Response.Redirect(@Href("/EditProducts"));
     }

Далее используем метод QuerySingle который будет возвращать одну запись запроса:

var row = db.QuerySingle(selectQueryString, productId);

Присваиваем переменным, значения которые содержаться в row:

var name = row.name;
    var description = row.description;
    var price = row.price;

Фрагмент кода if(isPost) {…}, будет выполняться, после нажатия на кнопку "Update". В данном фрагменте осуществляется проверка введенных данных, с помощью метода String.IsNullOrEmpty() и выполнение SQL запроса с параметрами на обновление конкретной записи:

var updateQueryString = 
              "UPDATE Product SET name=@0, description=@1, price=@2 WHERE id=@3";
            db.Execute(updateQueryString, name, description, price, productId);
            Response.Redirect(@Href("/EditProducts"));

6.Запустим страницу EditProducts.cshtml и кликнем "Edit" последней записи. После чего отобразиться страница UpdateProducts.cshtm: