我正在开展加入SportEvent
的项目,我希望用户在创建活动时使用EventStart
类型输入EventEnd
和DateTime
。当用户尝试在已选择的DateTime
值中创建事件时,我想禁止用户创建新事件。
以下是一些截图:
SportEventController中的方法
SportEvent的属性
.cshtml用于设置DateTime
值
这些值保存在SQL数据库中,我想检查现有DateTime
和EventStart
EventEnd
值
答案 0 :(得分:1)
创建新事件时,您可以使用(pseudo-sql)搜索重叠日期的现有事件:
Select * from events e where EventStart < @end and EventEnd > @start
@start和@end是新活动的日期。如果查询给出结果,则意味着期间至少部分重叠,然后只是阻止新事件的创建。
更新:如果another answer有疑问,这个SQL会帮助您获得部分或完全覆盖时间跨度的情况,无论如何。花点时间在纸上模拟不同的案例,这样就可以解决这个问题。
答案 1 :(得分:1)
我发现问题已从SQL查询更改为发现冲突,将它们放在代码中并对其进行操作。
我不确定BadRequest和Ok做了什么,你错过了一个代码层。但是你应该在你的ajax或php或其他任何调用中成功处理和处理错误 你的行动结果方法。我建议您在失败时根据失败原因向用户提供有意义的警报。所以如果是时间表冲突 他们可以更改计划信息,如果他们缺少可以填写的数据元素,或者如果保存失败,您可以以有意义的方式处理它。
看看这是否有助于您朝着正确的方向前进:
[HttpPost]
public IActionResult DoNotNameItPost([FromBody] SportEvent sportEvent)
{
if(sportEvent != null)
{
// you should probably just have 1 of these for your controller but we'll use local instantiation for the example
SportEventService ses = new SportEventService();
// your service should have a db connection that simply gets all your sportevents.
// I would recommend having a where clause that eliminates events that have already happend
// from the result set. thus "upcoming" instead of "existing" events
List<SportEvent> upcomingEvents = ses.GetUpcomingEventsToList();
bool conflict = false;
foreach(SportEvent se in upcomingEvents)
{
// logic: if the new BEGINS before existing ENDS
// OR new ENDS AFTER existing BEGINS there is a conflict
// OR if the new event completely encompasses an existing one
if( (sportEvent.EventStart < se.EventEnd) || (sportEvent.EventEnd > se.EventStart) || (sportEvent.EventStart < se.EventStart && sportEvent.EventEnd > se.EventEnd) )
{
conflict = true;
// break if you find 1 conflict, no need to find more than 1
break;
}
}
// success condition
if(!conflict)
{
// try to perform your save
if(_sportEventManager.Save(sportEvent))
{
return Ok(sportEvent);
}
else
{
BadRequest("Save failed");
}
}
// fail condition
else
{
return BadRequest ("Schedule Conflict");
}
}
else
{
return BadRequest ("Invalid SportEvent Data");
}
}
@Cas de Pender
我不确定我是否理解你所要求的确切内容
您在问题中显示的代码中缺少的是3折
一:你在cshtml上缺少某种动作。
二:该操作将直接转到控制器或利用php或javascript执行ajax调用
三:如何处理您的回复。 ajax调用应该通过您的新体育赛事,并期望收到成功或错误的消息。根据上面的代码。
你需要帮助吗?或者只是过滤的逻辑,如果结果有计划冲突?或两者兼而有之?
此处提供的答案是关于识别您的日程安排冲突。如果你需要帮助从你的.cshtml到你的ajax到你的控制器,然后收到响应并采取行动,这是一个单独的问题。
这是一个非常简单的例子,不使用javascript,php或ajax。如果这是您的问题,您可能希望制作一个新问题,并明确这是您要问的问题。 How do i send data to asp.net controller so that it can return a view?
我强烈建议您查找一个cshtml教程并完成这些步骤。一旦看到模式,您就可以将其移动到您的应用程序中,每次需要时都会更有意义。
答案 2 :(得分:0)
previous answer发布的问题是,只有在新事件完全包含在现有事件的时间范围内时,它才会返回。
尝试改为:
SELECT * FROM Events WHERE ((newStart BETWEEN Start AND End) OR (newEnd BETWEEN Start AND End)) OR (newStart < Start AND newEnd > End)
如果您想真正喜欢,可以使用现有事件将日历加载到UI中。这可能会强制您的用户选择一个尚未选择的时间,从而完全阻止检查(以及防止必须返回“错误 - 已在使用中的时间”和“请再试一次”消息给您的用户)。