Динамическое управление с проверкой клиента MVC - PullRequest
0 голосов
/ 11 мая 2011

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

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

//<![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 все они регистрируются одновременно.

1 Ответ

0 голосов
/ 19 мая 2011

Я понял это. Мне нужно было использовать 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"
});
//]]>

<% } %>
...