我正在使用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>
然后显示为更大视图的一部分:
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”等失败条件替换它。
或者我可以更新我的部分视图,因为这样做会做同样的事情。
我在这里错过了一些简单的东西吗?或者,我是否完全吠叫了错误的树?
答案 0 :(得分:3)
你的问题非常好,而且解释得非常好,但它也有点模糊,因为它有点像“我该怎么办?”题。以下是一些可能有助于您开发解决方案的选项。
重新显示相同的视图。返回用户所在的视图,以便他们提交链接。这看起来像是一个简单的刷新。
return View();
通过AJAX提交请求并通过部分视图进行更新。在id
或类似的HTML元素上添加span
标记,其中包含单独的预订详情。使用AJAX提交请求,可能通过@Ajax.ActionLink
,让您的操作返回部分视图。
return PartialView("_OnlineBookingPartial", model);
返回部分视图后,请使用返回的数据更新特定预订。
再次使用AJAX,但返回JSON。另一种方法可能是您再次使用AJAX,而是返回JSON并对其执行某些操作。例如,您可以返回将Book
替换为{; 1}}的文本。即“会话已满”或“已预订!”。
return new JsonResult
{
Data = "Booked!"
}
就个人而言,我可能会使用AJAX来更新非AJAX(非Javascript)后备。
您可以使用@Ajax.ActionLink
并在控制器操作中检查请求是否为AJAX来执行此操作。
if (Request.IsAjaxRequest) {
return PartialView("_OnlineBookingPartial", model);
}
return View();
这意味着如果浏览器启用了Javascript并支持AJAX,它将被使用,整个过程将为用户提供无缝和即时的过程。如果禁用Javascript,页面将只是刷新。