【问题标题】:What's the best way to localize non Data Annotation Errors with ASP.NET MVC 3?使用 ASP.NET MVC 3 本地化非数据注释错误的最佳方法是什么?
【发布时间】:2011-08-07 12:53:12
【问题描述】:

借助数据注释,现在可以使用 Resource.resx 文件轻松本地化错误消息,例如:

public class Student
{
    . . .

    [Required(ErrorMessageResourceName ="Required",
     ErrorMessageResourceType = typeof(StudentResources))]
    [StringLength(16)] 
    [Display(Name = "FirstName", ResourceType = typeof(StudentResources))]
    public string FirstName { get; set; }

    . . .
}

现在,假设我想检查一个学生是否已经为给定的月份和年份付款:

public bool CheckIfAlreadyPaid(Payment payment)
{
    return repository.GetPayments().Any(p => p.StudentId == payment.StudentId &&
                                        p.Month == payment.Month &&
                                        p.Year == payment.Year);
}

如果他已经付款,我将在我的服务层中执行以下操作:

if (CheckIfAlreadyPaid(payment))
{
    modelState.AddModelError("AlreadyPaid",
    Resources.Views.Payment.PaymentCreateResources.AlreadyPaid);
}

它有效,但我对引用服务层内的资源文件没有信心。

是否有标准或更好的方法来本地化与模型属性(数据注释)无关的错误消息 - 来自业务逻辑规则的错误?我还应该将这些错误添加到 ModelStateDictionary 中吗?

【问题讨论】:

    标签: asp.net-mvc validation localization business-logic


    【解决方案1】:

    我同意,我认为不应该在服务层。看起来它既可以放入自定义数据验证属性中,也可以在该级别使用其他方法进行处理(使用Fluent Validation 可能是一个不错的选择)。无论哪种方式,我认为只要验证保留在 MVC 应用程序本身中,您就可以轻松地使用资源文件来存储消息。

    【讨论】:

      【解决方案2】:

      我以不同的方式做到了。 Service 层用于检查是否已经付款。在我的Controller 中,我向 ModelState 对象添加了一条验证错误消息,向它传递了一个本地化的字符串资源。现在我对这种方法感觉更舒服了。

      代码如下:

      /// <summary>
      /// Performs validation of business logic...
      /// </summary>
      /// <param name="payment"></param>
      /// <returns></returns>
      private bool ValidatePayment(Payment payment)
      {
          if (paymentService.IsPaymentMade(payment))
          {
              ModelState.AddModelError("AlreadyPaid", Localization.AlreadyPaid);
          }
      
          return ModelState.IsValid;
      }
      

      编辑:

      为了补充我的答案,我今天刚刚发现 ValidationSummary @Html.ValidationSummary(true) 完全符合我的要求:

      Html.ValidationSummary 返回一个无序列表(ul 元素) ModelStateDictionary 对象中的验证消息,并且可以选择仅显示模型模型级错误。

      我正在传递true,它只会在页面顶部的摘要中显示模型级错误(非数据注释错误)。这很棒,但前提是它可以工作...... :)

      我遇到了一个问题,即当我设置 ValidationSummary(true) 时,没有出现与模型属性无关的自定义错误消息。然后我使用谷歌搜索并找到了这个post。我尝试了他的解决方案,但没有奏效。然后我再搜索了一下,在 Google Books(Steven Sanderson 的 Pro ASP.NET MVC 2 Framework)中找到了这个link。

      我尝试了那里描述的将一个空字符串作为键 (string.Empty) 并完成了这项工作。

      if(paymentService.IsPaymentMade(payment))
      {
          ModelState.AddModelError(string.Empty, Localization.PaymentAlreadyCreated);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-07
        • 2010-09-18
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        • 2012-04-11
        • 1970-01-01
        相关资源
        最近更新 更多