2011-05-11 3 views
0

У меня есть приложение MVC 2, и я использую проверку на стороне клиента. Форма имеет часть, в которой поля динамически создаются из базы данных. Я хочу также разрешить проверку на стороне клиента для любого поля, которое должно быть полным полем (числовым).Динамические элементы управления с проверкой клиента mvc

Итак, я взял большой блоб кода проверки и построил соответствующее заявление

//<![CDATA[ 
if (!window.mvcClientValidationMetadata) { window.mvcClientValidationMetadata = []; } 
window.mvcClientValidationMetadata.push({ "Fields": 
     [{ "FieldName": "<%= id %>", "ReplaceValidationMessageContents": true, "ValidationMessageId": "<%= id %>_validationMessage", "ValidationRules": 
      [{ "ErrorMessage": "You must enter an <%= id %>", "ValidationParameters": {}, "ValidationType": "required" }, 
       { "ErrorMessage": "The <%= id %> must be more than $0.00", "ValidationParameters": { "minimum": 0.01, "maximum": 1.7976931348623157E+308 }, "ValidationType": "range" }, 
       { "ErrorMessage": "The field <%= id %> must be a number.", "ValidationParameters": {}, "ValidationType": "number" } 
     ]}], "FormId": "new-creditcard-form", "ReplaceValidationSummary": false, "ValidationSummaryId": "CreditCardSummary" 
}); 

//]]> 

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

Любые идеи, как я могу заставить это работать правильно?

EDIT:

Я обнаружил, что если я называю метод, называемый __MVC_EnableClientValidation, который находится в MicrosoftMvcJQueryValidation.cs сразу после построения полого подтверждения, он игнорирует любые другие определения проверки. Так или иначе, мне нужно будет ввести мою проверку в большое определение поля проверки. так что, когда вызывается __MVC_EnableClientValidation, все они регистрируются сразу.

ответ

0

Я понял это. Мне нужно использовать splice вместо push

<% if (Model.HasCustomValidation) { %> 
//<![CDATA[ 
if (!window.mvcClientValidationMetadata) { window.mvcClientValidationMetadata = []; } 
window.mvcClientValidationMetadata.splice(0,0,{ "Fields": 
     [{ "FieldName": "<%= id %>", "ReplaceValidationMessageContents": true, "ValidationMessageId": "<%= id %>_validationMessage", "ValidationRules": 
      [ 
       <% if (Model.EnableTotalledValidation) { %> 
        { "ErrorMessage": "The <%= Model.Column.Name %> in row <%= Model.RowNumber %> cannot be empty.", "ValidationParameters": {}, "ValidationType": "required" }, 
        { "ErrorMessage": "The <%= Model.Column.Name %> in row <%= Model.RowNumber %> must be a number.", "ValidationParameters": {}, "ValidationType": "number" } 
       <% } %> 

       <% if(Model.EnableTotalledValidation && (Model.EnableRegexValidation || Model.EnableLengthValidation)) { %> 
        , 
       <% } %> 

       <% if(Model.EnableRegexValidation) { %> 
        {"ErrorMessage":"<%: Model.Column.ClientSideRegexErrorMessage %>","ValidationParameters":{"pattern":"<%: Model.Column.ClientSideRegex %>"},"ValidationType":"regularExpression"} 
       <% } %> 
      ] 
     }], "FormId": "new-creditcard-form", "ReplaceValidationSummary": false, "ValidationSummaryId": "CreditCardSummary" 
}); 
//]]> 

<% } %> 
+0

Вы также можете сделать это: http://stackoverflow.com/questions/13379339/how-to-add-a-new-validation-rule-to-mvcclientvalidationmetadata –

Смежные вопросы