首页 > 解决方案 > 如果块没有被执行

问题描述

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

标签: if-statementasp.net-core-mvccrud

解决方案


我有允许用户租车的功能,但我没有找到阻止用户租同一辆车的方法。

为防止多个用户同时更新同一个实体时发生并发冲突,您可以尝试添加一个名为 的跟踪属性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


推荐阅读