如果未执行块

时间:2019-12-10 20:13:03

标签: if-statement asp.net-core-mvc crud

我正在创建一个具有.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;没有执行。它有什么问题,或者有其他方法可以实现这一目标?

1 个答案:

答案 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