Отображение пользовательской ошибки при просмотре нарушения первичного ключа с помощью Entity Framework Core - PullRequest
0 голосов
/ 01 октября 2019

Я хочу, чтобы пользовательское сообщение об ошибке отображалось так же, как и в случае с необходимостью, регулярным выражением и т. Д., Но с нарушением первичного ключа.

Проверка выполняется таким образом, чтобы никогда не иметь возможности вставить первичный ключ. Что я положу в другом?

Я не хочу использовать 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);
}

Ответы [ 3 ]

0 голосов
/ 01 октября 2019

Вы можете добавить модель ошибки к объекту, например так:

[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);
    }
0 голосов
/ 01 октября 2019

Спасибо Гильерме.

Ниже приведен код, который работает.

[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);
        }
0 голосов
/ 01 октября 2019

Я предполагаю, что у вас есть веб-приложение, а не веб-API - потому что это не указано в вашем коде.

В ядре Asp.net вы можете настроить промежуточное ПО обработки ошибок:

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

Тогда вы можете иметь контроллер ошибок, как показано ниже, который возвращает представление на основе типа исключения.

[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.
}

Надеюсь, что это поможет!

СОВЕТ - даже если у вас есть веб-API, вы можете вернуть API кодов бизнес-ошибок из пользовательского интерфейса, и тогда пользовательский интерфейс может показать соответствующийсообщения об ошибках, основанные на этих кодах.

Ссылка: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/error-handling?view=aspnetcore-3.0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...