2

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

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

Asp.net MVC 2 でデフォルトの ModelState エラー メッセージを置き換える方法について説明した解決策を試しました。およびASP.NET MVC - 値の型のカスタム検証メッセージ ですが、それらを機能させることができません。

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

誰にもアイデアはありますか?

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

したがって、「a」を ProcessOrder に入力すると、Messages.resx に PropertyValueInvalid (および 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;
        }
    }
4

3 に答える 3

1

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

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

于 2010-01-16T13:32:39.370 に答える
0

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

DefaultModelBinder.ResourceClassKey

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

これは、値を割り当てるために使用していたものです(無駄に):

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

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

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

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

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

@Html.TextBoxFor(m => m.Amount, new Dictionary<string, object>() {{ "data-val-number", HttpContext.GetGlobalResourceObject("ValidationMessages", "PropertyValueInvalid") } })
于 2012-07-26T03:37:07.923 に答える