Кажется, что в DataAnnotations есть какая-то дыра в том, что пользователь, вводящий какой-либо текст в поле, которое войдет в int, никогда не достигнет кода DataAnnotations. Он запускает ошибку привязки модели и отображает ошибку пользователю «Значение 'a' недопустимо для поля XXXX."
В любом случае, все очень хорошо, что он автоматически обрабатывает эту ситуацию, но я действительно хочу отобразить сообщение об ошибке, указывающее на проблему, например. «Значение« a »не является числовым. Пожалуйста, введите числовое значение для поля XXXX».
Я пробовал решения, изложенные Как заменить сообщение об ошибке ModelState по умолчанию в Asp.net MVC 2? и 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;
}
}