我正在尝试创建一个15分钟的计时器,当用户点击“检出”或锁定案例的按钮时,它启动一个计时器,在15分钟内运行一个动作来翻转我的数据库中的布尔开关将在15分钟后再次解锁该案件。我假设这需要在我的服务器端代码上完成,而不是在Javascript中,因为如果一个人离开页面脚本将无法运行。我希望我可以在我的动作方法中插入一些可以做到这一点的方法。我已经研究过了,但是找不到关于如何解决这个问题的明确答案。任何帮助将不胜感激。
using (Html.BeginForm("CheckoutCase", "Case"))
{
@Html.HiddenFor(x => x.ID)
<input type="submit" value="Checkout" name="submitAction" class="btn btn-block alert-success"/>
}
控制器
[HttpPost]
public ActionResult CheckoutCase(int id)
{
Case currentCase = db.Cases.Find(id);
currentCase.LockCase = true;
currentCase.Lockout_TS = DateTime.Now;
db.SaveChanges();
string url = this.Request.UrlReferrer.AbsolutePath;
return Redirect(url);
}
答案 0 :(得分:2)
假设currentCase.Lockout_TS
持有被DateTime
标记为已锁定的currentCase
,并且当案例被锁定时,它已为所有用户锁定,为什么不检查已过去使用TimeSpan.TotalMinutes
在DateTime.Now
和currentCase.Lockout_TS
之间的时间以分钟为单位?
//if currentCase is locked...
if (currentCase.LockCase)
{
//...check if it's been more than 15 minutes since currentCase was locked
bool shouldUnlock = (DateTime.Now - currentCase.Lockout_TS).TotalMinutes > 15;
//if yes, then unlock it
if (shouldUnlock)
{
currentCase.LockCase = false;
//persist the changes and proceed accordingly
}
//if we've reached this point, shouldUnlock was false _
//which means that currentCase shouldn't be unlocked yet _
//so proceed accordingly
}
else
{
//currentCase is not locked, proceed accordingly
}