2012-09-18 25 views
48

を使用していない両方のエラーはこれが私のモデルである:どちらかErrorMessageStringまたはErrorMessageResourceNameを設定する必要がありますが、CreditCardAttribute

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を設定していないので、間違ったことを理解していない。誰でも助けてくれますか?

答えて

147

これは、.Net 4.5の既知の問題です。 "ErrorMessage = null"という名前のパラメータを追加するとこれが解決されます。

参考: 参照リンクが壊れています。 http://connect.microsoft.com/VisualStudio/feedback/details/757298/emailaddress-attribute-is-unable-to-load-error-message-from-resource-mvc

+24

新しい「EmailAddress」データ注釈を使用しているときに同じエラーが発生しました。これで問題は解決しました。ありがとう! –

+1

しかし、これにより、カスタムエラーメッセージセットも削除されます。嘘をつきにくい方法でIansの答えをチェック! http://stackoverflow.com/a/16211476/268091 – MEMark

+0

@MEMarkこれは、リソースから直接エラーメッセージを設定する必要性に対応したものです。カスタムエラーメッセージへの参照を理解しているかわかりません。 –

-1

私がローカライズしていたプロパティで同じ問題が発生しました。私はErrorMessageResourceType、その後ErrorMessageResourceNameを定義したが、誤ってだけでなく、単に私が問題を修正ErrorMessageを除去することによって、私の場合には例外だから、

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

を投げた上にErrorMessageのatrtributeを入れていました。

+1

これはエラーを見るとかなり明白です。 OPには 'ErrorMessage'が設定されていなかったので、エラーを出してはいけません。その理由は、[@DipenBhikadya](http://stackoverflow.com/a/12488268/1682559)に記載されているように、データアノテーションアトリビュート自体のバグです。あなたの問題は、エラーから明らかになった 'ErrorMessage'を削除したときに本当にあなたの問題を解決しますが、OPのものと同じエラーメッセージを持つ別の問題です。 –

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"; 
    } 
} 
+0

これは完璧です!私は長い間、属性のプロパティで成功せずにだまされていました。 – MEMark

13
[CreditCard(ErrorMessageResourceType = typeof(Messages), ErrorMessageResourceName = "CardNumberInvalid", ErrorMessage = null)] 

あなたの問題を解決しますErrorMessage = nullを追加します。

0

カスタム検証属性を使用していて、ローカリゼーション目的でリソースからエラーメッセージを読み込みたい場合は、この問題に直面するので、ここで回避策を共有します。
は、カスタム検証を持っていることを前提とし、あなたのカスタム検証で、この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を使用する必要があります。

0

私はカスタムValidationAttributeで同様の問題がありました。

IsValidメソッドで、私はErrorMessageを設定していました。この修正は、私はユニットテストを足すたし、彼らはiを1 /デバッグ1を実行していた場合にのみ、pasisngた

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のpropetyに逢引を削除することでした。しかし、「すべて実行」をクリックすると、最初のものだけが通過していましたか?彼らはそうそう、私はそれが誰かを助けることを願っにErrorMessageのpropety

に逢引を削除...どんな方法で

にリンクされていません!

関連する問題