ユーザーが 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;
}
}