asp.net 使用Entity Framework Core在主键冲突时在View上显示自定义错误

nkkqxpd9  于 2023-06-25  发布在  .NET
关注(0)|答案(3)|浏览(91)

我想显示一个自定义的错误消息,就像是需要的情况下,regex等,但主键违规。
进行检查,以便永远不能插入主键。我还能放些什么?
我不想使用Ajax或ViewBag/ViewState,否则我知道怎么做。我想在表单发布时显示错误“此代码已存在”。

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Code,Libelle")] Marque marque)
{
    if (ModelState.IsValid)
    {
        var codeExists = _context.Marque.Where(s => s.Code == marque.Code)
                                        .FirstOrDefault()
                                        .Code == marque.Code ? "yes" : "no";

        if (codeExists == "no")
        {
            _context.Add(marque);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }
        else
        {
        }
    }

    return View(marque);
}
fxnxkyjh

fxnxkyjh1#

你可以给对象添加一个模型错误,如下所示:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Code,Libelle")] Marque marque)
{
    if (ModelState.IsValid)
    {
        var codeExists = _context.Marque.Where(s => s.Code == marque.Code).FirstOrDefault().Code == marque.Code ? "yes" : "no";
        if (codeExists == "no")
        {
            _context.Add(marque);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }
        else
        {
             ModelState.AddModelError("Error occurred", "Your custom error exception");
        }
    }
    return View(marque);
}
jhdbpxl9

jhdbpxl92#

我假设您有一个web应用程序而不是web API -因为这在您的代码中没有指定。
在Asp.net core中,您可以配置错误处理中间件:

if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
else
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

然后您可以使用如下所示的Error控制器,它返回基于异常类型的视图。

[AllowAnonymous]
public IActionResult Error()
{
    var exceptionHandlerPathFeature =
    HttpContext.Features.Get<IExceptionHandlerPathFeature>();

    if (exceptionHandlerPathFeature?.Error is FileNotFoundException)
    {
        ExceptionMessage = "File error thrown";
    }
    if (exceptionHandlerPathFeature?.Path == "/index")
    {
        ExceptionMessage += " from home page";
    }

     // Either show exception message on page or return different views based on conditions.
}

希望这有帮助!

提示-即使有Web API,也可以选择将API中的业务错误代码返回给UI,UI可以根据这些代码显示相应的错误信息。

参考:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/error-handling?view=aspnetcore-3.0

ctrmrzij

ctrmrzij3#

谢谢Guilherme。
下面是工作的代码。

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Code,Libelle")] Marque marque)
{
    if (ModelState.IsValid)
    {
        var codeExists = _context.Marque.Where(s => s.Code == marque.Code).FirstOrDefault().Code == marque.Code ? "yes" : "no";
        if (codeExists == "no")
        {
            _context.Add(marque);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }
        else
        {
            ModelState.AddModelError("Code","This code already exists");
        }
    }
    return View(marque);
}

相关问题