2009-07-30 2 views
2

Приветствия.Удалить действие с View Page

Попытка обернуть мою голову вокруг 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-адреса. Что я здесь делаю неправильно?

назнач

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

     _contractsControlRepository.DeleteBusiness(businessToDelete); 

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

ответ

4

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

+0

Бинго. Я обновлю свой вопрос, чтобы показать исправление. – Kezzer

1

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

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

+0

Это немного запутанно, не так ли? Однако я полностью понимаю логику в вашем заявлении. Именно в этом примере удобно использовать таблицу данных с кнопками удаления рядом с каждой записью. На самом деле это требование системы действительно. – Kezzer

+0

В учебнике NerdDinner определенная причина, по которой не разрешена DELETE в HTTP GET, заключается в том, что «мы хотим быть осторожными, чтобы защищать от веб-сканеров ... непреднамеренно вызывая удаление данных, когда они следуют ссылкам ...» –

+0

на самом деле. Но что, если я хочу кнопку удаления на каждом из них? Должен ли я предоставить форму и кнопку для каждого из них? Мне нужны они как гиперссылки, а не формы. – Kezzer

1

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

В есть контроллеры для Delete являются

// 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)); 
    }   
} 
Смежные вопросы