首页 > 解决方案 > 一个或多个实体的 C# MVC 验证失败

问题描述

我已经与这个问题作斗争了一个多星期,现在我已经阅读了包括 StackOverflow 在内的在线文章,我遇到了一些类似的文章,但我遇到的文章都没有解决我的问题。

以下是错误:

一个或多个实体的验证失败。有关更多详细信息,请参阅“EntityValidationErrors”属性。说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.Data.Entity.Validation.DbEntityValidationException:一个或多个实体的验证失败。有关更多详细信息,请参阅“EntityValidationErrors”属性。

这是我的帐户控制器:

// POST: /Account/Register
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
    if (ModelState.IsValid)
    {
        var user = new User() { UserName = model.Email, Email = model.Email  };
        var result = await UserManager.CreateAsync(user, model.Password);
        if (result.Succeeded)
        {
            await SignInAsync(user, isPersistent: false);
            return RedirectToAction("Index", "Home");
        }
        else
        {
            AddErrors(result);
        }
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

以下是您的建议后我的新代码:

// POST: /帐户/注册

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
    try
    {
        if (ModelState.IsValid)
        {
            var user = new User() { UserName = model.Email, Email = model.Email };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                await SignInAsync(user, isPersistent: false);
                return RedirectToAction("Index", "Home");
            }
            else
            {
                AddErrors(result);
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }
    catch (System.Data.Entity.Validation.DbEntityValidationException ex)
    {
        foreach (var errors in ex.EntityValidationErrors)
        {
            foreach (var validationError in errors.ValidationErrors)
            {
                // get the error message 
                string errorMessage = validationError.ErrorMessage;

                //Or log your error message here
            }
        }
        throw;
    }
}

我犯了同样的错误。

标签: c#.netmodel-view-controller

解决方案


尝试DbEntityValidationException通过对您的 api 方法使用 try/catch 块来捕获类型异常,

catch (DbEntityValidationException ex)
{
    foreach (var errors in ex.EntityValidationErrors)
    {
        foreach (var validationError in errors.ValidationErrors)
        {
             // get the error message 
            string errorMessage = validationError.ErrorMessage;

            //Or log your error message here
        }
    }
}

所以最后你的方法看起来像,

// POST: /Account/Register
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
    try
    {
        if (ModelState.IsValid)
        {
            var user = new User() { UserName = model.Email, Email = model.Email  };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                await SignInAsync(user, isPersistent: false);
                return RedirectToAction("Index", "Home");
            }
            else
            {
                AddErrors(result);
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }
    catch (DbEntityValidationException ex)
    {
        foreach (var errors in ex.EntityValidationErrors)
        {
            foreach (var validationError in errors.ValidationErrors)
            {
                // get the error message 
                string errorMessage = validationError.ErrorMessage;

                //Or log your error message here
            }
        }
        throw;
    }        
}

注意:确保最后,上述方法不会给您检测到无法访问的代码并返回适当的消息或视图或数据。


推荐阅读