У меня странная проблема с моим опубликованным решением asp.net MVC4. До сих пор с валидацией все идет хорошо. Тогда что-то пойдет не так только на моем опубликованном сервере IISTEST (локально через VS2012 проблем нет, даже «запустить без отладки», поэтому пакеты активны).
Что не так? Я заметил 2 или 3 вещи, но давайте поговорим о первой.
У меня есть некоторая проверка на стороне клиента для разных текстовых полей, параметров... Один из них больше не управляет проверкой на моем опубликованном сервере. Чтобы проверить это, я перехожу на страницу, нажимаю F12, нажимаю на текстовое поле и копирую html.
Вот локальная версия (проходит через VS2012):
<input name="EmergencyReason" class="input-validation-error" id="EmergencyReason" type="text" data-val="true" hideRow="true" data-val-requiredifloadingtoday="Le champ {0} n'est pas valide." value=""/>
Как видите, есть некоторая проверка.
Вот опубликованная версия:
<input name="EmergencyReason" id="EmergencyReason" type="text" jQuery17205969379292482464="55" hiderow="true"/>
Больше никакой проверки. Но некоторые из моих текстовых полей имеют проверку, некоторые нет.
Я замечал, что каждый раз, когда у меня есть текстовое поле, проверка которого больше не работает, у меня есть это: jQuery17205969379292482464 вместо ошибки проверки ввода... У меня есть это решение для скрипта и css. Может быть, это поможет вам понять.
Есть идеи? Я занимаюсь этой проблемой с полдня, поэтому любая помощь очень ценится.
Спасибо.
ОБНОВИТЬ ------------------------
После выполнения некоторых тестов локально и манипулирования F12 / «режим браузера» >> IE7 я обнаружил, что jQuery17205969379292482464 появляется локально и на сервере, поэтому это не связано с моей проблемой. Одно можно сказать наверняка: некоторые базовые проверки клиента, такие как атрибуты [Required], работают. Проверка тех, кто больше не работает, выглядит следующим образом:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class RequiredIfLoadingTodayAttribute : ValidationAttribute, IClientValidatable
{
public RequiredIfLoadingTodayAttribute() { }
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
///////////////
// IsLoading //
///////////////
var propertyIsLoadingInfo = validationContext.ObjectType.GetProperty("IsLoading");
var propertyIsLoadingValue = propertyIsLoadingInfo.GetValue(validationContext.ObjectInstance, null);
//////////
// Date //
//////////
var propertyDateInfo = validationContext.ObjectType.GetProperty("Date");
var propertyDateValue = propertyDateInfo.GetValue(validationContext.ObjectInstance, null);
////////////////
// Validation //
////////////////
Boolean isLoading = Convert.ToBoolean(propertyIsLoadingValue);
DateTime dateLoading = Convert.ToDateTime(propertyDateValue);
DateTime dateToday = Convert.ToDateTime(DateTime.Now.ToString("dd/MM/yyyy"));
// Validation uniquement pour le chargement
if (isLoading)
{
// Si la date de chargement = date du jour et on a pas de raison indiquée -> déclencher une erreur de validation
if ((DateTime.Compare(dateLoading, dateToday)==0) && (value==null))
{
return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
}
}
return ValidationResult.Success;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule {
ErrorMessage = this.ErrorMessageString,
ValidationType = "requiredifloadingtoday"
};
yield return rule;
}
}
И связанный файл js:
$.validator.unobtrusive.adapters.add(
'requiredifloadingtoday', '', function (options) {
options.rules['requiredifloadingtoday'] = options.params;
options.message['requiredifloadingtoday'] = options.message;
});
$.validator.addMethod('requiredifloadingtoday', function (value, element, params) {
// Cette validation côté client n'est utilisée que sur le tab chargement
// pour s'assurer qu'une raison est indiquée dans le cas ou la date
// de chargement est le jour même.
return (($Date.val() == DateToday) && (value != ''))
}, '');
И модель представления:
[RequiredIfLoadingToday()]
public string EmergencyReason { get; set; }
И вид:
<script type="text/javascript" src="@Url.Content("~/Scripts/Loading/When.js")"></script>
<span class="editor-field">
@Html.TextBoxFor(m => m.EmergencyReason, Model.Date != DateTime.Today ? new {hideRow="true"} : null)
</span>
...
Я не знаю, в чем проблема с этой немного «более продвинутой» проверкой. Проблема с Аяксом?
jQuery17205969379292482464
. Это uuid, который jquery добавляет к элементам DOM, когда ему нужно с ними взаимодействовать. Вот ответ, который объясняет детали stackoverflow.com/a/7150719/1314859. Сомневаюсь, что это источник вашей проблемы. - person Alexander Manekovskiy   schedule 10.02.2013