2


0

ASP.NET MVC:DataAnnotations-フィールドが数値でなければならないことを示すエラーメッセージを表示する

intに入るフィールドにテキストを入力したユーザーがDataAnnotationsコードに到達しないという点で、DataAnnotationsの動作には何らかの穴があるように見えます。 モデルバインディングエラーを開始し、ユーザーに「値 'a’はXXXXフィールドに対して無効です」というエラーを表示します。

とにかく、この状況を自動的に処理するのはとても素晴らしいことですが、実際には問題を示すエラーメッセージを表示したいと思います。 「値 'a’は数値ではありません。 XXXXフィールドに数値を入力してください」。

私はhttps://stackoverflow.com/questions/1538873/how-to-replace-the-default-modelstate-error-message-in-asp-net-mvc-2 [デフォルトを置き換える方法を設定ソリューションを試してみましたAsp.net MVC 2のModelStateエラーメッセージ]およびhttps://stackoverflow.com/questions/646270/asp-net-mvc-custom-validation-message-for-value-types/1374653#1374653[ASP.NET MVC -値型のカスタム検証メッセージ]、しかし、私はそれらを動作させることができません。

ここ(http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultmodelbinder.resourceclasskey.aspx)には「プロパティが無効なクラスキー(存在しないリソースファイルなど)に設定されている場合、MVCは例外をスローします。」そして、行をDefaultModelBinder.ResourceClassKey = "asdfasdhfk"に変更しても、例外はありません。

誰かアイデアがありますか?

編集:ここにいくつかのコードがあります。 すべてが機能していて、Messages.resxファイルのメッセージは使用されていません。 Messages.resxのコードは自動生成されるため、ここには含めません。

そのため、ProcessOrderに「a」を入力すると、PropertyValueInvalidのMessages.resxに入力したもの(および適切な測定のためにInvalidPropertyValue)ではなく、汎用メッセージになります。

Application_Startメソッド

protected void Application_Start()
{
    RegisterRoutes(RouteTable.Routes);
    ModelBinders.Binders.DefaultBinder = new Microsoft.Web.Mvc.DataAnnotations.DataAnnotationsModelBinder(); //set dataanooations to be used
    DefaultModelBinder.ResourceClassKey = "Messages"; //set data annotations to look in messages.resx for the default messages
    ValidationExtensions.ResourceClassKey = "Messages";
}

エンティティクラス

[MetadataType(typeof(GLMetaData))]
public partial class GL
{

}



public class GLMetaData
{
    public int TransRefId { get; set; }

    [DisplayName("Process Order")]
    public int? ProcessOrder { get; set; }

    [DisplayName("Trans Type")]
    [StringLength(50)]
    public string TransType { get; set; }

    [StringLength(100)]
    public string Description { get; set; }

    [DisplayName("GL Code")]
    [StringLength(20)]
    public string GLCode { get; set; }

    [DisplayName("Agents Credit No")]
    [StringLength(50)]
    public string AgentsCreditNo { get; set; }

    [Required]
    public bool Active { get; set; }
}

コントローラの操作:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(GL glToBeUpdated)
    {
        try
        {
            if (!ModelState.IsValid)
                return View(glToBeUpdated);

            //set auto properties
            glToBeUpdated.UpdateDate = DateTime.Now;
            glToBeUpdated.UpdateUser = this.CurrentUser;

            glDataLayer.update(glToBeUpdated);

            glDataLayer.submitChanges();

            return RedirectToAction("Index");
        }
        catch
        {
            glDataLayer.abortChanges();

            throw;
        }
    }

3 Answer


1


同様の問題に対処するために行ったのは、モデルの状態をクリアし、無効な値をモデルのプロパティに設定しようとして引き起こされたnull値に対してではなく、 `ModelState [" XXXX "]。Value.AttemptedValue`に対して検証することでした。エラーメッセージとモデル値のリセット。

そのようにして、必要なエラーメッセージを表示し、必要に応じて複数のエラーメッセージを表示できます(「値が必要」または「値は数値でなければなりません」)。


0


私は、MVC4 RCで1日の大半をこれと戦いました。 何を設定しても

DefaultModelBinder.ResourceClassKey

それはうまくいかないようでした。 また、ジャンクを割り当てたときに例外をスローすることもありませんでした。

これは私が値を割り当てるために使用していたものです(利用できません):

 DefaultModelBinder.ResourceClassKey = typeof(App_GlobalResources.ValidationMessages).Name;

最終的に、クライアント側でこのエラーメッセージに取り組み、jQueryがメッセージの表示に使用するデータ属性をオーバーライドすることにしました。

@Html.TextBoxFor(m => m.Amount, new Dictionary(){{"data-val-number","Invalid Number"}})

これは私がそれを必要とする方法で機能しています。

皮肉なことに、これも機能します:

@Html.TextBoxFor(m => m.Amount, new Dictionary() {{ "data-val-number", HttpContext.GetGlobalResourceObject("ValidationMessages", "PropertyValueInvalid") } })


0


ここでは、連絡先番号フィールドを文字列として取りましたが、範囲属性を使用して、リソースファイルからifを使用するための数値検証を提供できます。

    [Required(ErrorMessageResourceType = typeof(Global), ErrorMessageResourceName = "ContactNumberRequired")]
    [Range(0, int.MaxValue, ErrorMessageResourceType = typeof(Global), ErrorMessageResourceName = "ValidContactNumber")]
    [Display(Name = "Contact Number")]
    public string ContactNumber { get; set; }

そのため、ここではErrorMessageResourceNameをキーとして提供しています。 多言語でもカスタマイズして使用できます