52

这是我的模型:

namespace MvcApplication2.Models
{
    public class CreditCard
    {
        [CreditCard(ErrorMessageResourceType = typeof(Messages), ErrorMessageResourceName = "CardNumberInvalid")]
        public string CardNumber { get; set; }
    }
}

这是我的 Messages.resx:

名称 值

CardNumberInvalid 检查您的卡号是否正确

这是我的观点:

@model MvcApplication2.Models.CreditCard
@Html.TextBoxFor(m => m.CardNumber);

在 MVC 版本 3 中,这可以正常工作。在 MVC 4 中,当我转到此页面时,我得到一个异常提示“必须设置 ErrorMessageString 或 ErrorMessageResourceName,但不能同时设置”。这只发生在 CreditCardAttribute 上。其他验证属性(例如RequiredAttribute)可以正常工作。我只设置了 ErrorMessageResourceName。我没有设置ErrorMessageString,所以不明白我做错了什么。有人可以帮忙吗?

4

9 回答 9

153

这是 .Net 4.5 中的一个已知问题。添加“ErrorMessage = null”命名参数应该可以解决这个问题。

参考:参考链接现已损坏。 http://connect.microsoft.com/VisualStudio/feedback/details/757298/emailaddress-attribute-is-unable-to-load-error-message-from-resource-mvc

于 2012-09-19T03:47:06.223 回答
15
[CreditCard(ErrorMessageResourceType = typeof(Messages), ErrorMessageResourceName = "CardNumberInvalid", ErrorMessage = null)]

添加ErrorMessage = null将解决您的问题。

于 2013-12-30T22:53:36.720 回答
10

我遇到了这个问题,因为我实现了一个自动RequiredAttributeAdapter设置ErrorMessageResourceName属性的 .

您可以通过在设置之前检查是否设置了 ErrorMessage 属性来修复它ErrorMessageResourceName

/// <summary>
/// Creates a new instance of the RequiredAttributeAdapter, used for switching the default required message
/// format
/// </summary>
public CustomMessageRequiredAttributeAdapter(
    ModelMetadata metadata,
    ControllerContext context,
    RequiredAttribute attribute
)
    : base(metadata, context, attribute)
{
    if (string.IsNullOrEmpty(attribute.ErrorMessage))
    {
        attribute.ErrorMessageResourceType = typeof (ValidationMessages);
        attribute.ErrorMessageResourceName = "PropertyValueRequired";
    }
}
于 2013-04-25T09:44:41.660 回答
1

由于任何使用自定义验证属性并且还想从资源中加载错误消息以进行本地化的人都会遇到这个问题,所以我在这里分享我的解决方法。
假设您有一个像这样的自定义验证属性

[FileTypeMustBe("jpg")]
public HttpPostedFileBase MyFile {get; set;}

在您的自定义验证属性中添加此代码

public override string FormatErrorMessage(string name)
    {
        return String.Format(CultureInfo.CurrentCulture,
          ErrorMessageString, name, ValidFileType);
    }

ValidFileType 是一个属性的名称,它接受自定义验证属性的输入参数(此处为jpg),现在我们可以按照我们喜欢的方式装饰我们的模型属性

[FileTypeMustBe("jpg", ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "WrongFileTypeError")]
public HttpPostedFileBase MyFile {get; set;}

如您所见,无需再添加ErrorMessage=null,因为我们在自定义验证类中处理了它。只是不要忘记如果您在自定义验证中初始化了任何错误消息字符串,您必须现在将其删除并FormatErrorMessage改用。

于 2016-04-27T02:00:39.890 回答
0

更换

[Required(ErrorMessage = "")]

[Required()]

为我工作,将ErrorMessage保留为空白字符串也没有任何意义

于 2020-11-11T05:56:09.177 回答
0

我在使用返回 aValidationResult而不是a 的自定义“ValidationAttribute”时遇到了这个问题bool。当我返回一个未分配的字符串时,ValidationResult它会抛出错误

Either ErrorMessageString or ErrorMessageResourceName must be set, but not both

当我返回时ValidationResult(null),该字段永远不会验证,它总是无效的。看起来 .NET 会寻找 aValidationResult来确定该字段是否有效,而不是它是否包含错误字符串。为了让它验证并消除我需要返回null结果的错误。

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
    string errMsg = null;

    // Do validation and assign the error message

    return (!string.IsNullOrEmpty(errMsg)) ? new ValidationResult(errMsg) : null;
}
于 2021-02-23T06:21:57.000 回答
0

我对自定义 ValidationAttribute 有一个类似的问题。

在 IsValid 方法中,我设置了 ErrorMessage。解决方法是删除对 ErrorMessage 属性的分配...

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
    //code before ...
    this.ErrorMessage = this.FormatErrorMessage(validationContext.DisplayName); //NOT GOOD...
    ValidationResult validationResult = new ValidationResult(this.ErrorMessage, //And using the ErrorMessage Here...
        new[] { validationContext.MemberName });
    return validationResult;
}

我正在编写单元测试,只有当我一个接一个地运行/调试时,它们才会被传递。但是当我点击“全部运行”时,只有第一个通过了?他们没有以任何方式链接......

所以,是的,只需删除对 ErrorMessage 属性的分配

我希望它会帮助别人!

于 2017-08-11T18:28:18.713 回答
0

就我而言,我使用ErrorMessage 的是"".Net Core 3.1 API。

[Required]
[RegularExpression("^[1-9]\\d*$", ErrorMessage ="")]
public int fieldName { get; set; }

我改成,ErrorMessage ="Invalid Value Or some other message"问题就解决了。

于 2020-07-08T20:07:00.167 回答
-1

我在本地化的财产上遇到了同样的问题。我已经定义了 ErrorMessageResourceType 然后是 ErrorMessageResourceName 但是错误地将 ErrorMessage 属性也放在了引发异常的地方

[NotEqualTo("User_Name", ErrorMessageResourceType = typeof(LROResources.Global), ErrorMessageResourceName = "UserPasswordCannotBeUsername", ErrorMessage = "The password cannot be the same as your Username.")]

因此,就我而言,只需删除即可ErrorMessage解决问题。

于 2013-02-18T17:11:53.403 回答