我正在创建一个具有.net核心的租车应用程序。我具有允许用户租用汽车的功能,但是我没有找到一种方法来防止用户租用同一辆汽车。这是RentController:
[HttpGet]
public IActionResult Create(int id)
{
ViewData["IsRented"] = false;
return View(new Rent { CarId = id, UserId = GetCurrentUserId(),
DateTaken = DateTime.Today});
}
// POST: Rents/Create
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("RentId,CarId,UserId,DateTaken,ReturnDate")] Rent rent)
{
if (RentExists(rent.Id))
{
ViewData["IsRented"] = true;
}
else if (ModelState.IsValid)
{
_context.Rent.Add(rent);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(rent);
}
private bool RentExists(int id)
{
return _context.Rent.Any(e => e.Id == id);
}
然后使用Create.cshtml租一辆新车:
@if ((bool)ViewData["IsRented"])
{
<div class="alert alert-danger" role="alert">
This car is rented!
</div>
}
这里的想法是这样的:如果已经有租车ID,则显示错误(租车!),并且不允许用户租车。如果没有,则用户可以租用它,因此可以创建新的租用。显然某事不起作用,因为ViewData [“ IsRented”] = true;没有执行。它有什么问题,或者有其他方法可以实现这一目标?
答案 0 :(得分:0)
我具有允许用户租用汽车的功能,但是我没有找到一种方法来防止用户租用同一辆车。
为防止多个用户同时更新同一实体时的并发冲突,可以尝试添加名为RowVersion
的跟踪属性,然后可以检查它是否在其中引发了DbUpdateConcurrencyException
异常。您的代码逻辑以确定是否发生冲突。
try
{
//your code logic
await _context.SaveChangesAsync();
//...
}
catch (DbUpdateConcurrencyException ex)
{
//Unable to save changes. Data of car may have been modified or deleted since entities were loaded.
//code logic here
}
有关并发处理的更多信息,请查看本教程。
https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/concurrency?view=aspnetcore-3.1