2009-07-30 39 views
2

問候。從視圖中刪除操作頁面

爲了讓我的頭繞過MVC,我剛剛實現了一個簡單的添加/刪除頁面,它也查看記錄。這使得用戶可以更輕鬆地從一個頁面執行大部分操作,而無需離開以執行簡單的任務。該頁面可讓您添加記錄(具有ID和名稱的公司),該記錄工作正常。但是,當我刪除一條記錄時,我做了以下操作以允許刪除發生:

<%= 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"); 
    } 
    } 

回答

4

你爲什麼不重定向用戶回做排行榜的企業頁面,如果刪除succeded?

+0

賓果。我會更新我的問題以顯示修復程序。 – Kezzer 2009-07-30 10:43:36

1

我第二maciejkow的答案,重定向消除了用戶重新發布數據,如果他們嘗試刷新頁面的機會。另一件事,我不會把刪除操作放在一個鏈接(即一個GET)中,這些操作應該始終是POST(自動化工具有時可能跟隨頁面上的鏈接緩存原因),所以我會包裝一個迷你表單中的按鈕用於刪除,而隱藏字段中的businessToDelete變量。

+0

雖然有點混亂,不是嗎?不過,我完全理解你聲明中的邏輯。只是在這個例子中,每個條目旁邊都有刪除按鈕的數據表很方便。事實上,這是系統真正的要求。 – Kezzer 2009-07-30 10:52:20

1

我剛剛通過了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: /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)); 
    }   
}