ASP.NET MVC: DataAnnotations - Показать сообщение об ошибке, указывающее, что поле должно быть числовым - PullRequest
2 голосов
/ 12 января 2010

Кажется, что в 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;
        }
    }

Ответы [ 3 ]

1 голос
/ 16 января 2010

То, что я сделал для борьбы с подобной проблемой, состояло в том, чтобы очистить состояние модели, выполнить проверку по ModelState["XXXX"].Value.AttemptedValue вместо нулевого значения, вызванного попыткой ввести недопустимое значение в свойство модели, заполнив сообщения об ошибках и сбросив Значения модели.

Таким образом, я могу получать сообщения об ошибках, которые я хочу, и при необходимости предлагать более одного («требуется значение» или «значение должно быть числовым»).

0 голосов
/ 24 июля 2014

Здесь я взял поле Контактный номер как строку, но с атрибутом диапазона, поэтому могу предоставить числовую валидацию для использования 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 в качестве ключа. Вы можете настроить и использовать его также на нескольких языках

0 голосов
/ 26 июля 2012

Я боролся с этим большую часть дня на MVC4 RC. Неважно, что я установил

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") } })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...