ASP.NET MVC - Пользовательское сообщение проверки для типов значения

Чтобы уточнить. Важно знать, что:

  • Да, вы должны передать объект Date Javascript.
  • Да, это должно быть ISODate friendly
  • Да, из моего опыта, чтобы это работало, вам нужно манипулировать датой ISO
  • Да, работает с датами, как правило, всегда утомительный процесс, а mongo не является исключением

. Вот рабочий фрагмент кода, где мы немного манипулируем датами для обеспечения Mongo (здесь я использую mongoose и хотите, чтобы результаты для строк, атрибут даты которых меньше (до) даты, заданной как параметр myDate), могут корректно обрабатывать:

var inputDate = new Date(myDate.toISOString());
MyModel.find({
    'date': { $lte: inputDate }
})
23
задан Giovanni Galbo 14 March 2009 в 17:25
поделиться

7 ответов

Ищите ModelState.AddError.

1
ответ дан Daniel A. White 29 November 2019 в 02:22
поделиться

Я использовал потрясающую xVal платформу проверки. Это позволяет мне сделать всю свою проверку в модели (Даже LINQ-SQL :)). Это также испускает JavaScript, требуемый для клиентской проверки.

Править: Извините не учтенный ссылка для того, как получить его работающий на LINQ-SQL

Основной рабочий процесс проходит примерно так.

public partial class YourClass
{
    [Required(ErrorMessage = "Property is required.")]
    [StringLength(200)]
    public string SomeProperty{ get; set; }
}

try
{
    // Validate the instance of your object
    var obj = new YourClass() { SomeProperty = "" }
    var errors = DataAnnotationsValidationRunner.GetErrors(obj);
    // Do some more stuff e.g. Insert into database
}
catch (RulesException ex)
{
    // e.g. control name 'Prefix.Title'
    ex.AddModelStateErrors(ModelState, "Prefix");   
    ModelState.SetModelValue("Prefix.Title", new ValueProviderResult(ValueProvider["Prefix.Title"].AttemptedValue, collection["Prefix.Title"], System.Globalization.CultureInfo.CurrentCulture));

}
4
ответ дан 29 November 2019 в 02:22
поделиться

С помощью DefaultModelBinder можно переопределить требуемое по умолчанию сообщение об ошибке, но, к сожалению, оно будет применяться глобально, что IMHO делает его совершенно бесполезным. Но если вы решите сделать это, вот как:

  1. Добавьте папку App_GlobalResources на свой сайт ASP.NET
  2. Добавьте файл ресурсов с именем Messages.resx
  3. Внутри файла ресурсов объявите новый строковый ресурс с ключом PropertyValueRequired и некоторое значение
  4. В Application_Start добавьте следующую строку:

     DefaultModelBinder.ResourceClassKey = "Сообщения";
    

Как видите, нет связи между проверяемым свойством модели и сообщением об ошибке.

В заключение, лучше написать собственную логику проверки для обработки этого сценария. Один из способов - использовать тип, допускающий значение NULL (System.Nullable ), а затем:

if (model.MyProperty == null || 
    /** Haven't tested if this condition is necessary **/ 
    !model.MyProperty.HasValue)
{
    ModelState.AddModelError("MyProperty", "MyProperty is required");
}
6
ответ дан 29 November 2019 в 02:22
поделиться

«Единственный способ», не изменяющий ни один из входных dicts, -

basket = dict(basket_one, **basket_two)

В случае конфликта элементы из basket_two переопределят элементы из корзина_one . Как однострочные, это довольно читаемо и прозрачно, и я не испытываю угрызений совести против использования его в любое время, когда пригодится дикт, состоящий из двух других (любой читатель, у которого есть проблемы с его пониманием, на самом деле очень хорошо обслуживается способ побудить его или услышать о dict и форме ** ;-). Так, например, такие варианты использования, как:

x = mungesomedict(dict(adict, **anotherdict))

, довольно часто встречаются в моем коде.

Примечание: в Python 3 это будет работать, только если каждый ключ в anotherdict является строкой. См. эти альтернативы .

3
ответ дан 29 November 2019 в 02:22
поделиться

В ASP.NET MVC 1 я тоже столкнулся с этой проблемой.

В моем проекте есть модель или бизнес-объект с именем «Entry», а его первичный ключ EntryId - int? type, а значение EntryId может быть разрешено вводить пользователям.

Таким образом, проблема в том, что, когда поле пустое, или нулевое, или какое-то целое значение, которое существовало, пользовательские сообщения об ошибках могут отображаться хорошо, но если value - это какое-то нецелое значение, такое как «a», я не могу найти способ использовать настраиваемое сообщение для замены сообщения по умолчанию, такого как «Значение 'a' недействительно».

когда я отслеживаю сообщение об ошибке в ModelState , я обнаружил, что если значение не является целым числом, будут две ошибки, связанные с EntryId, и сообщение об ошибке первого элемента будет пустым ...

Теперь мне нужно использовать такой уродливый код, чтобы взломать проблему.

2
ответ дан 29 November 2019 в 02:22
поделиться

Да, есть способ, вы должны использовать System.ComponentModel.DataAnnotations в сочетании с xVal , и вы сможете установить правила проверки и сообщения (вы даже можете использовать файлы ресурсов для локализации) для каждого вашего свойства с использованием атрибутов
смотрите здесь http://blog.codeville.net/2009/01/10/xval-a-validation -framework-for-aspnet-mvc /

0
ответ дан 29 November 2019 в 02:22
поделиться

Создайте свой ModelBinder, расширив DefaultModelBinder:

public class LocalizationModelBinder : DefaultModelBinder

Переопределите SetProperty:

        base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value);

        foreach (var error in bindingContext.ModelState[propertyDescriptor.Name].Errors.
            Where(e => IsFormatException(e.Exception)))
        {
            if (propertyDescriptor.Attributes[typeof(TypeErrorMessageAttribute)] != null)
            {
                string errorMessage =
                    ((TypeErrorMessageAttribute)propertyDescriptor.Attributes[typeof(TypeErrorMessageAttribute)]).GetErrorMessage();
                bindingContext.ModelState[propertyDescriptor.Name].Errors.Remove(error);
                bindingContext.ModelState[propertyDescriptor.Name].Errors.Add(errorMessage);
                break;
            }
        }

Добавьте функцию bool IsFormatException(Exception e), чтобы проверить, является ли исключение исключением FormatException:

if (e == null)
            return false;
        else if (e is FormatException)
            return true;
        else
            return IsFormatException(e.InnerException);

Создайте класс Attribute:

[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = false)]
public class TypeErrorMessageAttribute : Attribute
{
    public string ErrorMessage { get; set; }
    public string ErrorMessageResourceName { get; set; }
    public Type ErrorMessageResourceType { get; set; }

    public TypeErrorMessageAttribute()
    {
    }

    public string GetErrorMessage()
    {
        PropertyInfo prop = ErrorMessageResourceType.GetProperty(ErrorMessageResourceName);
        return prop.GetValue(null, null).ToString();
    }
}

Добавьте атрибут к свойству, которое вы хотите проверить:

[TypeErrorMessage(ErrorMessageResourceName = "IsGoodType", ErrorMessageResourceType = typeof(AddLang))]
    public bool IsGood { get; set; }

AddLang - resx файл и IsGoodType - имя ресурса.

И, наконец, добавьте это в Global.asax.cs Application_Start:

ModelBinders.Binders.DefaultBinder = new LocalizationModelBinder();

Будьте здоровы!

19
ответ дан 29 November 2019 в 02:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: