我发布的 asp.net MVC4 解决方案有一个奇怪的问题。到目前为止,关于验证的一切都很顺利。然后只有在我发布的 IISTEST 服务器上出现问题(通过 VS2012 在本地没有问题,即使是“不调试就开始”,所以捆绑包是活动的)。
怎么了?我注意到两三件事,但让我们谈谈第一件事。
我对不同的文本框、选项进行了一些客户端验证……其中一个在我发布的服务器上不再管理验证。要检查这一点,我导航到页面,按 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 代替 input-validation-error ... 我捆绑了这个脚本和 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>
...
我不知道这个“更高级”的验证问题出在哪里。阿贾克斯问题?