Получение IndexOutOfRangeException в ModelClientValidationRule - PullRequest
0 голосов
/ 07 февраля 2020

Я использую IClientValidatable, а GetClientValidationRules вызывает много IndexOutOfRangeException, пока ИТ-администратор не перезапустит пул IIS.

Я видел ответ здесь это показывает, что происходит, но я все еще не знаю, как решить это, потому что я не могу изменить словарь ModelClientValidationRule.ValidationParameters, я так долго боролся с этим, и я никогда не чувствовал себя так близко, чтобы найти решение, пока я прочитайте ответ, но по-прежнему чувствуете, что нашли решение.

Это исключение, которое я получаю:

Index was outside the bounds of the array.     at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   at CORP.EX.UI.UX.Annotations.ExpressionRequiredIfAttribute.<GetClientValidationRules>d__0.MoveNext()
   at System.Linq.Enumerable.<ConcatIterator>d__58`1.MoveNext()
   at System.Linq.Enumerable.<SelectManyIterator>d__16`2.MoveNext()
   at System.Web.Mvc.UnobtrusiveValidationAttributesGenerator.GetValidationAttributes(IEnumerable`1 clientRules, IDictionary`2 results)
   at System.Web.Mvc.HtmlHelper.GetUnobtrusiveValidationAttributes(String name, ModelMetadata metadata)
   at System.Web.Mvc.Html.InputExtensions.InputHelper(HtmlHelper htmlHelper, InputType inputType, ModelMetadata metadata, String name, Object value, Boolean useViewData, Boolean isChecked, Boolean setId, Boolean isExplicitValue, String format, IDictionary`2 htmlAttributes)
   at System.Web.Mvc.Html.InputExtensions.TextBoxFor[TModel,TProperty](HtmlHelper`1 htmlHelper, Expression`1 expression, String format, IDictionary`2 htmlAttributes)
   at System.Web.Mvc.Html.InputExtensions.TextBoxFor[TModel,TProperty](HtmlHelper`1 htmlHelper, Expression`1 expression, Object htmlAttributes)
   at CORP.EX.UI.UX.Helpers.HtmlHelpers.TextBoxForExpressionRequiredIf[TModel,TValue](HtmlHelper`1 html, Expression`1 expression, Object additionalViewData)
   at ASP._Page_Views_UX_DatosGenerales__DatosGeneralesEX_cshtml.Execute() in c:\inetpub\wwwroot\ThisWeb\Views\UX\DatosGenerales\_DatosGeneralesEX.cshtml:line 61
   at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
   at System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
   at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
   at System.Web.Mvc.Html.PartialExtensions.Partial(HtmlHelper htmlHelper, String partialViewName, Object model, ViewDataDictionary viewData)
   at ASP._Page_Views_UX__Step1_cshtml.Execute() in c:\inetpub\wwwroot\ThisWeb\Views\UX\_Step1.cshtml:line 35

Строка 61 моего кода, когда выбрасывается исключение:

@Html.TextBoxForExpressionRequiredIf(m => Model.mail, new
                {
                    @class = "form-control required input fullmail",
                    @data_status = false,
                    @autocomplete = "off"
                })

Класс ExpressionRequiredIfAttribute:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
    public class ExpressionRequiredIfAttribute : ValidationAttribute, IClientValidatable
    {
        public string OtherProperty { get; private set; }
        public string OtherPropertyDisplayName { get; set; }
        public object OtherPropertyValue { get; private set; }
        public string Expresion { get; set; }

        public override object TypeId
        {
            get { return new object(); }
        }

        public static Random r = new Random();

        public ExpressionRequiredIfAttribute(string otherProperty, object otherPropertyValue)
            : base("'{0}' is required because '{1}' has a value {3}'{2}'.")
        {
            this.OtherProperty = otherProperty;
            this.OtherPropertyValue = otherPropertyValue;
        }

        public override bool RequiresValidationContext
        {
            get { return true; }
        }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            .........

        }

        public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
        {
            string key = metadata.ContainerType.FullName + "." + metadata.GetDisplayName();

            var rule = new ModelClientValidationRule();
            string tmp = string.Empty;


            rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName());

            rule.ValidationParameters["listvalues"] = OtherPropertyValue;
            rule.ValidationParameters.Add("listvalues", OtherPropertyValue);
            rule.ValidationParameters.Add("otherproperty", OtherProperty);
            rule.ValidationParameters.Add("expresion", Expresion);

            rule.ValidationType = "expressionrequiredif" + char.ConvertFromUtf32(r.Next(97, 122));

            yield return rule;
        }
    }
...