Удалить действие со страницы просмотра - PullRequest
2 голосов
/ 30 июля 2009

Привет.

В попытке обернуть голову вокруг MVC, я только что реализовал простую страницу добавления / удаления, которая также просматривает записи. Это облегчает пользователям выполнение большинства задач с одной страницы, вместо того чтобы выполнять простые задачи. На странице можно добавить запись (бизнес, который имеет идентификатор и имя), который работает нормально. Однако, когда я удаляю запись, я сделал следующее, чтобы разрешить удаление:

<%= Html.ActionLink("delete", "DeleteBusiness", new { businessToDelete = B.BusinessID }) %>

Это прекрасно работает для удаления записи. Вот как выглядит действие моего контроллера:

public ActionResult DeleteBusiness(string businessToDelete)
{
     try
     {
       if (!ModelState.IsValid)
         return View("Businesses", _contractsControlRepository.ListBusinesses());

         _contractsControlRepository.DeleteBusiness(businessToDelete);

         return View("Businesses", _contractsControlRepository.ListBusinesses());
     }
     catch
     {
       return View("Businesses", _contractsControlRepository.ListBusinesses());
     }
}

Итак, со страницы «Бизнес» у меня есть ActionLink, которая просто направляет меня к этому действию в контроллере, который выполняет работу, а затем возвращает представление, в котором я был ранее. Тогда проблема в том, что после того, как я удалил , запись моего фактического URL заканчивается так:

http://localhost:3340/Accounts/ContractsControl/DeleteBusiness?businessToDelete=TEST

Это нехорошо, потому что когда я потом добавляю новую запись, она мне не дает. Действие моего контроллера, позволяющее мне добавлять записи, выглядит следующим образом:

  [AcceptVerbs(HttpVerbs.Post)]
  public ActionResult Businesses(Business business)
  {
    try
    {
      if (!ModelState.IsValid)
        return View(_contractsControlRepository.ListBusinesses());

      _contractsControlRepository.CreateBusiness(business);
      return View(_contractsControlRepository.ListBusinesses());
    }
    catch
    {
      return View(_contractsControlRepository.ListBusinesses());
    }
  }

Любой запрос post считается созданием новых записей. Это правильно? Вот мое мнение, чтобы завершить все это:

<% using (Html.BeginForm())
   { %>

  <fieldset class="inline-fieldset">
    <legend>Add Business</legend>

    <p>
    <label for="ID">ID</label>

    <%= Html.TextBox("BusinessID", null, new { style = "width:50px;", @class = "uppercase", maxlength = "4" })%>
    <%= Html.ValidationMessage("BusinessID", "*")%>

    <label for="Business">Business</label>

    <%= Html.TextBox("BusinessCol")%>
    <%= Html.ValidationMessage("BusinessCol", "*")%>

    <input type="submit" value="Add" />
  </p>

  <%= Html.ValidationSummary("Uh-oh!") %>

  </fieldset>

<% } %>

<table>
<tr>
<th>ID</th>
<th>Business</th>
<th></th>
<th></th>
</tr>
  <% foreach (Business B in ViewData.Model)
  { %>
    <tr>
      <td><%= B.BusinessID %></td>
      <td><%= B.BusinessCol %></td>
      <td class="edit"><%= Html.ActionLink("edit", "EditBusiness", new { id = B.BusinessID }) %></td>
      <td class="delete"><%= Html.ActionLink("delete", "DeleteBusiness", new { businessToDelete = B.BusinessID }) %></td>
    </tr>
  <% } %>
</table>

Как вы можете видеть в самом низу, у меня есть ссылки на действия (игнорируйте правку). Поэтому, если я удаляю запись, то сразу же пытаюсь добавить ее, она не будет работать, потому что (я предполагаю), что URL неверный. Что я тут не так делаю?

FIXED

  public RedirectToRouteResult DeleteBusiness(string businessToDelete)
  {
    try
    {
      if (!ModelState.IsValid)
        return RedirectToAction("Businesses");

      _contractsControlRepository.DeleteBusiness(businessToDelete);

      return RedirectToAction("Businesses");
    }
    catch
    {
      return RedirectToAction("Businesses");
    }
  }

Ответы [ 3 ]

4 голосов
/ 30 июля 2009

Почему бы вам не перенаправить пользователя обратно на страницу списка предприятий, если удаление прошло успешно?

1 голос
/ 30 июля 2009

Я только что прошел учебник по NerdDinner.

Там есть контроллеры для удаления

// GET: /Dinners/Delete/1
public ActionResult Delete(int id)
{
    Dinner dinner = dinnerRepository.GetDinner(id);
    if (dinner == null)
    {
        return View("NotFound");
    }
    else
    {
        return View(dinner);
    }
}


    // POST: /Dinners/Delete/1
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Delete(int id, string confirmButton)
    {
        Dinner dinner = dinnerRepository.GetDinner(id);

        if (dinner == null)
        {
            return View("NotFound");
        }

        dinnerRepository.Delete(dinner);
        dinnerRepository.Save();

        return View("Deleted");
    }

и контроллеры для Get.

// GET: /Dinners/Edit/2
[Authorize]
public ActionResult Edit(int id)
{

    Dinner dinner = dinnerRepository.GetDinner(id);

    if (!dinner.IsHostedBy(User.Identity.Name))
    {
        return View("InvalidOwner");
    }

    return View(new DinnerFormViewModel(dinner));
}

//
// POST: /Dinners/Edit/2
[AcceptVerbs(HttpVerbs.Post),Authorize]
public ActionResult Edit(int id, FormCollection formValues)
{
    Dinner dinner = dinnerRepository.GetDinner(id);
    if (!dinner.IsHostedBy(User.Identity.Name))
    {
        return View("InvalidOwner");
    }
    try
    {

        UpdateModel(dinner);
        dinnerRepository.Save();

        return RedirectToAction("Details", new { id = dinner.DinnerID });
    }
    catch (Exception ex)
    {
        foreach (var issue in dinner.GetRuleViolations())
        {
            ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
        }
        return View(new DinnerFormViewModel(dinner));
    }           
}
1 голос
/ 30 июля 2009

Я второй ответ Мачейкова, перенаправление исключает возможность повторной публикации данных пользователем, если он попытается обновить страницу.

Другое дело, я бы не стал добавлять действия удаления в ссылку (например, GET), такого рода действия всегда должны быть POST (автоматические инструменты могут иногда следовать ссылкам на странице по причинам кэширования), поэтому я бы обернул кнопка в мини-форме для удаления, с переменной businessToDelete в скрытом поле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...