ASP.NET MVC 3中本地化非数据注释错误的最佳方法是什么?

5
使用数据注释,现在可以通过像这样的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中?

2个回答

0

我用了一种不同的方式。使用 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。我尝试了他的解决方案,但它没有起作用。之后我又在谷歌上搜索了一些,发现了这个链接 link(由Steven Sanderson编写的Pro ASP.NET MVC 2 Framework)。我尝试了那里描述的方法,将空字符串作为键传递 (string.Empty),它奏效了。
if(paymentService.IsPaymentMade(payment))
{
    ModelState.AddModelError(string.Empty, Localization.PaymentAlreadyCreated);
}

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接