Я использую 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;
}
}