2013-05-29 43 views
2

我正在使用MVC4與實體框架,並像許多人,我是新來的MVC,並試圖讓我的頭繞着設計模式。你應該返回什麼ActionResult來更新ActionLink文本?

我有一個局部視圖,它顯示會話列表,後面跟着允許經過身份驗證的成員登錄到會話的actionlinks。

注意:爲了清楚起見,我已經截掉了大部分代碼,如果成員預訂了會話,它將顯示「預訂」而不是操作鏈接。

@using OnlineBookings.Website.Models 
@{ DateTime currentDate = DateTime.MinValue.Date; } 

<form method="post" action="~/Controllers/BookSessionController.cs"> 
@foreach (SessionsWithBookingInformation s in Model) 
{ 
    <p>@s.StartTime.ToString("t") 
      @s.Description 
      @Html.ActionLink(
          "Book", 
          "BookSession", 
          new { sessionId = s.SessionId } 
          ) 
    </p> 
}  
</form> 

然後,這顯示爲較大視圖的一部分:

enter image description here

的actionlinks傳遞會話的GUID來通過在我的控制器,以檢索MEMBERID預訂到以下函數從cookie中使用實體框架爲該成員和會話創建預訂。

public ActionResult BookSession(Guid sessionId) 
{ 
    using (var db = new OnlineBookingsEntities()) 
    { 
     // see if the member id is stored in a cookie 
     if (Request.Cookies["memberId"] != null) 
     { 
      var memberId = new Guid(Request.Cookies["memberId"].Value); 
      db.Bookings.Add(new Booking 
      { 
       BookingId = Guid.NewGuid(), 
       MemberId = memberId, 
       SessionId = sessionId, 
       BookingTime = DateTime.Now 
      }); 
      db.SaveChanges(); 
     } 
    } 

    // this refreshes the entire page 
    /// is there a better way to just replace the actionlink they clicked on? 
    return RedirectToAction("Index", "Home"); 
} 

這一切都很好,預訂正在有效記錄。

但是,我想圖是如果從BookSession函數返回只能更新動作鏈接文本。

理想情況下,如果成功,我想用「預訂」一詞替換部分視圖中的ActionLink,如果失敗,我想用「會話已滿」等失敗條件替換它。

或者我可以只更新我的部分視圖,因爲那樣做會做同樣的事情。

我在這裏錯過了一些簡單的東西嗎?或者,我吠叫完全錯誤的樹?

回答

3

你的問題很好,很好解釋,但它也有點模糊,因爲它有點「我該怎麼做?」題。以下是一些可以幫助您開發解決方案的選項。

  1. 重新顯示相同的視圖。返回用戶提交鏈接的任何視圖。這看起來像一個簡單的刷新。

    return View(); 
    
  2. 經由局部視圖經由AJAX和更新提交該請求。span或類似的HTML元素上放置一個id標記,其中包含單個預訂的詳細信息。用AJAX提交請求,也許通過@Ajax.ActionLink提交,並讓你的動作返回一個局部視圖。

    return PartialView("_OnlineBookingPartial", model); 
    

    返回部分視圖後,請使用返回的數據更新特定預訂。

  3. 再次使用AJAX,但返回JSON。另一種方式可能是您再次使用AJAX,但是您返回JSON並對其執行操作。例如,您可以返回要替換Book的文本;即「Session full」或「Booked!」。

    return new JsonResult 
        { 
         Data = "Booked!" 
        } 
    

就個人而言,我可能會使用AJAX與非AJAX(非JavaScript)後備更新。

您可以通過使用@Ajax.ActionLink並檢查請求是否在您的控制器操作中爲AJAX。

if (Request.IsAjaxRequest) { 
    return PartialView("_OnlineBookingPartial", model); 
} 

return View(); 

這意味着,如果瀏覽器已啓用了JavaScript和AJAX支持,它將被用於整個過程將是無縫和實時的用戶。如果Javascript被禁用,頁面將會刷新。

+0

感謝羅恩,我同意這真的是一個「從哪裏來?」題。我會重構,並試試這個:) –

相關問題