Чтобы уточнить. Важно знать, что:
. Вот рабочий фрагмент кода, где мы немного манипулируем датами для обеспечения Mongo (здесь я использую mongoose и хотите, чтобы результаты для строк, атрибут даты которых меньше (до) даты, заданной как параметр myDate), могут корректно обрабатывать:
var inputDate = new Date(myDate.toISOString());
MyModel.find({
'date': { $lte: inputDate }
})
Я использовал потрясающую 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));
}
С помощью DefaultModelBinder можно переопределить требуемое по умолчанию сообщение об ошибке, но, к сожалению, оно будет применяться глобально, что IMHO делает его совершенно бесполезным. Но если вы решите сделать это, вот как:
PropertyValueRequired
и некоторое значение В 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");
}
«Единственный способ», не изменяющий ни один из входных dicts, -
basket = dict(basket_one, **basket_two)
В случае конфликта элементы из basket_two
переопределят элементы из корзина_one
. Как однострочные, это довольно читаемо и прозрачно, и я не испытываю угрызений совести против использования его в любое время, когда пригодится дикт, состоящий из двух других (любой читатель, у которого есть проблемы с его пониманием, на самом деле очень хорошо обслуживается способ побудить его или услышать о dict
и форме **
;-). Так, например, такие варианты использования, как:
x = mungesomedict(dict(adict, **anotherdict))
, довольно часто встречаются в моем коде.
Примечание: в Python 3 это будет работать, только если каждый ключ в anotherdict
является строкой. См. эти альтернативы .
В ASP.NET MVC 1 я тоже столкнулся с этой проблемой.
В моем проекте есть модель или бизнес-объект с именем «Entry», а его первичный ключ EntryId - int? type, а значение EntryId может быть разрешено вводить пользователям.
Таким образом, проблема в том, что, когда поле пустое, или нулевое, или какое-то целое значение, которое существовало, пользовательские сообщения об ошибках могут отображаться хорошо, но если value - это какое-то нецелое значение, такое как «a», я не могу найти способ использовать настраиваемое сообщение для замены сообщения по умолчанию, такого как «Значение 'a' недействительно».
когда я отслеживаю сообщение об ошибке в ModelState , я обнаружил, что если значение не является целым числом, будут две ошибки, связанные с EntryId, и сообщение об ошибке первого элемента будет пустым ...
Теперь мне нужно использовать такой уродливый код, чтобы взломать проблему.
Да, есть способ, вы должны использовать System.ComponentModel.DataAnnotations в сочетании с xVal , и вы сможете установить правила проверки и сообщения (вы даже можете использовать файлы ресурсов для локализации) для каждого вашего свойства с использованием атрибутов
смотрите здесь http://blog.codeville.net/2009/01/10/xval-a-validation -framework-for-aspnet-mvc /
Создайте свой 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();
Будьте здоровы!