如何处理多行AddModelError错误?

时间:2018-10-17 22:01:14

标签: c# asp.net-mvc

我正在尝试检查表单上是否存在多个错误。这是我的代码:

  var hasErrors = false;
  var sb = new StringBuilder();

  if (string.IsNullOrEmpty(creditCard.CardNumber))
  {
    hasErrors = true;
    sb.AppendLine("Credit card number is required.");
    //ModelState.AddModelError("PaymentAmount", "Credit card number is required.");
  }

  if (string.IsNullOrEmpty(creditCard.ExpirationDateMonth) || string.IsNullOrEmpty(creditCard.ExpirationDateYear))
  {
    hasErrors = true;
    // ModelState.AddModelError("PaymentAmount", "Expiration date is required.");
    sb.AppendLine("Expiration date is required.");
  }

  if (string.IsNullOrEmpty(creditCard.NameOnCard))
  {
    hasErrors = true;
    // ModelState.AddModelError("PaymentAmount", "Name is required.");
    sb.AppendLine("Name is required.");
  }

  decimal amt = 0;
  creditCard.PaymentAmount = creditCard.PaymentAmount.Replace("$", string.Empty);
  if (!decimal.TryParse(creditCard.PaymentAmount, out amt))
  {
    hasErrors = true;
    //ModelState.AddModelError("PaymentAmount","Amount is invalid.");
    sb.AppendLine("Amount is invalid.");
  }

  if (hasErrors)
  {
    ModelState.AddModelError("PaymentAmount", sb.ToString().Replace(Environment.NewLine,"<br>"));
    return View("CreditCard", creditCard);
  }

我正试图让AddModelError多行显示,但我没有运气。它在屏幕上以文本形式显示<br>,而不是暂停。

我在单独提交错误的地方遇到了问题,但是在屏幕上看到错误之前,您必须多次提交表单。这就是在每一行中将AddModelError注释掉的原因。

是否可以在AddModelError上显示多行,或者有更好的方法来处理此问题?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

对于控制器中出现的每个错误,应调用ModelState.AddModelError,恕我直言,将验证逻辑与用户界面中的呈现方式相混合并不是一个好习惯。实际上,MVC模式就是要分离三个方面,即模型(数据),控制器(逻辑,例如验证)和视图(用户界面)。

所以我会做这样的事情:

if (string.IsNullOrEmpty(creditCard.CardNumber))
{
      ModelState.AddModelError("PaymentAmount", "Credit card number is required.");
}

if (string.IsNullOrEmpty(creditCard.ExpirationDateMonth) || string.IsNullOrEmpty(creditCard.ExpirationDateYear))
{        
    ModelState.AddModelError("PaymentAmount", "Expiration date is required.");
}

if (string.IsNullOrEmpty(creditCard.NameOnCard))
{
    ModelState.AddModelError("PaymentAmount", "Name is required.");
}

[…]

然后,在您的视图中,您可以使用以下HTML帮助器来呈现列表中的每个错误:

如果您使用的是ASP.NET Core:

<div asp-validation-summary="ValidationSummary.ModelOnly"></div>

如果使用的是早期版本的ASP.NET MVC:

@Html.ValidationSummary()

这将生成可使用CSS设置样式的HTML。

如果您使用的是asp.net核心,请参见here,以获取更多信息;如果您使用的是先前版本的ASP.NET MVC,请参见here

如果您想以其他方式显示错误,则可以直接在视图中甚至更好地访问错误,滚动自己的帮助器,请参阅以下问题的答案:How do I get the collection of Model State Errors in ASP.NET MVC?

相关问题