2

我将 MVC4 与实体框架一起使用,并且像许多人一样,我是 MVC 的新手,并试图了解设计模式。

我有一个部分视图,它显示一个会话列表,后跟允许经过身份验证的成员预订会话的操作链接。

注意:为了清楚起见,我已经删除了大部分代码,如果会员被预订到会话中,它会显示“已预订”而不是操作链接。

@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>

然后将其显示为更大视图的一部分:

在此处输入图像描述

操作链接将要预订的会话的 guid 传递给我的控制器中的以下函数,该函数从 cookie 中检索 memberId 并使用实体框架为该成员和会话创建预订。

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,失败时,我想用“会话已满”之类的失败条件替换它。

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

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

4

1 回答 1

3

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

  1. 重新显示相同的视图。返回用户在哪个视图上提交链接。这看起来像一个简单的刷新。

    return View();
    
  2. 通过 AJAX 提交请求并通过部分视图进行更新。id标签放在一个span或类似的 HTML 元素上,其中包含个人预订的详细信息。使用 AJAX 提交请求,也许通过@Ajax.ActionLink,并让您的操作返回部分视图。

    return PartialView("_OnlineBookingPartial", model);
    

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

  3. 再次使用 AJAX,但返回 JSON。另一种方法可能是您再次使用 AJAX,但您返回 JSON 并对其进行处理。例如,您可以返回要替换Book的文本;即“会话已满”或“已预订!”。

    return new JsonResult
        {
            Data = "Booked!"
        }
    

就个人而言,我可能会使用 AJAX 来更新非 AJAX(非 Javascript)后备。

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

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

return View();

这意味着如果浏览器启用了 Javascript 并支持 AJAX,它将被使用,并且整个过程对用户来说将是无缝且即时的。如果 Javascript 被禁用,页面将简单地刷新。

于 2013-05-29T23:05:38.137 回答