你应该返回什么ActionResult来更新ActionLink文本?

时间:2013-05-29 21:59:34

标签: asp.net-mvc-4

我正在使用MVC4和Entity Framework,就像很多人一样,我是MVC的新手,并试图了解设计模式。

我有一个部分视图,显示会话列表,后跟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传递给我的控制器中的以下函数,该函数从cookie中检索memberId并使用Entity Framework为该成员和会话创建预订。

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文本。

理想情况下,在成功时,我想在部分视图中将ActionLink替换为“Booked”一词,如果失败,我想用“Session full”等失败条件替换它。

或者我可以更新我的部分视图,因为这样做会做同样的事情。

我在这里错过了一些简单的东西吗?或者,我是否完全吠叫了错误的树?

1 个答案:

答案 0 :(得分:3)

你的问题非常好,而且解释得非常好,但它也有点模糊,因为它有点像“我该怎么办?”题。以下是一些可能有助于您开发解决方案的选项。

  1. 重新显示相同的视图。返回用户所在的视图,以便他们提交链接。这看起来像是一个简单的刷新。

    return View();
    
  2. 通过AJAX提交请求并通过部分视图进行更新。id或类似的HTML元素上添加span标记,其中包含单独的预订详情。使用AJAX提交请求,可能通过@Ajax.ActionLink,让您的操作返回部分视图。

    return PartialView("_OnlineBookingPartial", model);
    

    返回部分视图后,请使用返回的数据更新特定预订。

  3. 再次使用AJAX,但返回JSON。另一种方法可能是您再次使用AJAX,而是返回JSON并对其执行某些操作。例如,您可以返回将Book替换为{; 1}}的文本。即“会话已满”或“已预订!”。

    return new JsonResult
        {
            Data = "Booked!"
        }
    
  4. 就个人而言,我可能会使用AJAX来更新非AJAX(非Javascript)后备。

    您可以使用@Ajax.ActionLink并在控制器操作中检查请求是否为AJAX来执行此操作。

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

    这意味着如果浏览器启用了Javascript并支持AJAX,它将被使用,整个过程将为用户提供无缝和即时的过程。如果禁用Javascript,页面将只是刷新。