1

我发布的 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> 
 ...

我不知道这个“更高级”的验证问题出在哪里。阿贾克斯问题?

4

0 回答 0