2016-07-15 39 views
0

我在視圖中定義的操作鏈接ActionLink的不是呼叫控制器

@Html.ActionLink("Mark as Completed", "MarkComplete", new { id = item.ID }) 

然而,這並不調用該方法在我的控制器,而不是鏈接它會產生以下鏈接

http://localhost:52069/Users/MarkComplete/3

[HttpPost] 
    public ActionResult MarkComplete(int? id) { 
     if (id == null) { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
      } 
     Task task = db.Tasks.Find(id); 
     if (task == null) { 
      return HttpNotFound(); 
      } 
     if (ModelState.IsValid) { 
      task.Completed = 1; 
      db.Entry(task).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
      } 
     return View(task); 
     } 

我在這裏丟失的任何東西

Full Vi EW代碼

@model IEnumerable<Base.Models.Task> @{ 
    ViewBag.Title = "UserTasks"; } 

<h2>User</h2> 


@using (Html.BeginForm()) { 
    @Html.AntiForgeryToken() 

     <h4>Task for User</h4> 
     <table class="table"> 
      <tr> 
       <th> 
        Name 
       </th> 
       <th> 
        Details 
       </th> 
       <th> 
        Start Date 
       </th> 
       <th> 
        Due Date 
       </th> 
      </tr> 
        @foreach (var item in Model) { 
       <tr> 
        <td>@item.Name </td> 
        <td>@item.Details</td> 
        <td>@item.StartDate.ToShortDateString()</td> 
        <td>@item.EndDate.ToShortDateString()</td> 
        <td> 
         @Html.ActionLink("Mark as Completed", "MarkComplete", new { id = item.ID }) 
        </td> 
       </tr> 
         } 
       </table> 
    } 
      <div> 
       @Html.ActionLink("Back to List", "Index") 
      </div> 

      @section Scripts { 
       @Scripts.Render("~/bundles/jqueryval") 
      } 
+2

卸下'[HttpPost]'屬性(一個鏈路發出GET,而不是一個POST)。因爲你的方法正在改變數據 - 它應該是一個POST,並且在視圖中使用一個表單。你也可以刪除'if(ModelState.IsValid){' - 你不綁定到模型,所以它總是'真' –

+0

刪除現有的表單,併爲每個項目,使用@using(Html.BeginForm(「MarkComplete」 ,「yourController」,new {id = item.ID})){@ Html.AntiForgeryToken()}'也考慮使用ajax,以便用戶可以繼續 –

回答

2

你的動作標有HttpPost屬性而一個ActionLink產生GET請求。更確切地說,ActionLink呈現一個定位標記,當點擊時發送一個GET請求到服務器。

是否有任何特別的原因爲什麼該動作被標記爲HttpPost屬性?您可能希望刪除該屬性或將其替換爲HttpGet屬性。

如果是,由於某些原因,要求該操作僅偵聽POST請求,則可以不使用ActionLink而是使用單個按鈕樣式的表單作爲鏈接。

@using(Html.BeginForm("MarkComplete", "Users")) { 
    <input type="hidden" name="id" value="@item.ID"> 
    <input type="submit" value="Mark as Completed" /> 
} 

但是你已經包裹了整個表的窗體裏面,是的,形式不能嵌套,所以你需要更多的顯着改變的觀點。

所以整個視圖可能看起來像這樣:

@model IEnumerable<Base.Models.Task> 
@{ ViewBag.Title = "UserTasks"; } 

<h2>User</h2> 

<h4>Task for User</h4> 
<table class="table"> 
    <tr> 
     <th> 
      Name 
     </th> 
     <th> 
      Details 
     </th> 
     <th> 
      Start Date 
     </th> 
     <th> 
      Due Date 
     </th> 
    </tr> 
    @foreach (var item in Model) { 
     <tr> 
      <td>@item.Name </td> 
      <td>@item.Details</td> 
      <td>@item.StartDate.ToShortDateString()</td> 
      <td>@item.EndDate.ToShortDateString()</td> 
      <td> 
       @using(Html.BeginForm("MarkComplete", "Users")) { 
        @Html.AntiForgeryToken() 
        <input type="hidden" name="id" value="@item.ID"> 
        <input type="submit" value="Mark as Completed" /> 
       } 
      </td> 
     </tr> 
    } 
</table> 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 
+0

我有'HTTPPost'屬性,因爲這個方法會更新數據 – Darkestlyrics

+0

@Darkkelyrics好的,那麼你需要一個表單並使用'[ValidateAntiForgeryToken]',否則就會出現 – kamilk

+0

嘗試了你的方法,點擊按鈕,重置視圖(沒有任務),但它看起來並不像它在我的控制器中擊中MarkComplete方法(斷點沒有被擊中) – Darkestlyrics