2009-07-30 67 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)); 
    }   
}