Page_ClientValidate() с несколькими ValidationGroups - как показать несколько сводок одновременно?
ASP.NET 2.0. Допустим, у меня есть две группы валидации valGrpOne и valGrpTwo; и два сводки валидации valSummOne и valSummTwo; Причина разрыва секций является чисто эстетической. Одна кнопка отправки, которая запускает проверку для обеих групп.
Теперь я хочу инициировать проверку на стороне клиента, и хочу, чтобы одновременно отображались резюме валидации BOTH;
Итак, я настраиваю функцию Javascript, которая вызывается btnSubmit, и внутри этой функции я вызываю Page_ClientValidate("valGrpOne")
и Page_ClientValidate("valGrpTwo")
подряд; Проблема заключается только в одном сводке за раз (но мне действительно нужно, чтобы оба показывали!)
Любые идеи о том, как одновременно отображать оба сводки проверки, из клиентского кода?
Очень похоже на следующий вопрос, который отвечает за сервер.
Запуск нескольких групп проверки с помощью одной кнопки?
Ответы
Ответ 1
Хорошо, поэтому ответ был не простым. По-видимому, по умолчанию проверка на стороне клиента заключается в том, чтобы показать только последнюю группу/сводку, которая только что была проверена. Но немного Javascript tweeking дал мне приемлемый ответ.
Не стесняйтесь предлагать улучшения.
<script type="text/javascript" language="javascript">
/* Manual client-side validation of Validator Groups */
function fnJSOnFormSubmit() {
var isGrpOneValid = Page_ClientValidate("valGrpOne");
var isGrpTwoValid = Page_ClientValidate("valGrpTwo");
var i;
for (i = 0; i < Page_Validators.length; i++) {
ValidatorValidate(Page_Validators[i]); //this forces validation in all groups
}
//display all summaries.
for (i = 0; i < Page_ValidationSummaries.length; i++) {
summary = Page_ValidationSummaries[i];
//does this summary need to be displayed?
if (fnJSDisplaySummary(summary.validationGroup)) {
summary.style.display = ""; //"none"; "inline";
}
}
if (isGrpOneValid && isGrpTwoValid)
return true; //postback only when BOTH validations pass.
else
return false;
}
/* determines if a Validation Summary for a given group needs to display */
function fnJSDisplaySummary(valGrp) {
var rtnVal = false;
for (i = 0; i < Page_Validators.length; i++) {
if (Page_Validators[i].validationGroup == valGrp) {
if (!Page_Validators[i].isvalid) { //at least one is not valid.
rtnVal = true;
break; //exit for-loop, we are done.
}
}
}
return rtnVal;
}
</script>
Ответ 2
Не полностью протестировано:
/* Manual client-side validation of Validator Groups - Remix */
function PageValidate() {
var PageIsValid = true;
for (var validator in Page_Validators) {
ValidatorValidate(validator);
PageIsValid = PageIsValid && validator.isvalid;
}
if (PageIsValid) {
return true; //postback only when ALL validations pass.
}
else {
return false;
}
}
/* This also does something similar */
function PageValidate() {
return Page_ClientValidate();
}
Ответ 3
Вот еще один простой и общий метод проверки нескольких групп.
// Page_ClientValidate only shows errors from the last validation group.
// This method allows showing for multiple groups
function Page_ClientValidateMultiple(groups) {
var invalidIdxs = [];
var result = true;
// run validation from each group and remember failures
for (var g = 0; g < groups.length; g++) {
result = Page_ClientValidate(groups[g]) && result;
for (var v = 0; v < Page_Validators.length; v++)
if (!Page_Validators[v].isvalid)
invalidIdxs.push(v);
}
// re-show any failures
for (var i = 0; i < invalidIdxs.length; i++) {
ValidatorValidate(Page_Validators[invalidIdxs[i]]);
}
// return false if any of the groups failed
return result;
};
Ответ 4
это расширение joedotnot полезного кода. Вероятно, это превысило большинство пользователей asp.net, но это помогло проекту, в котором для отправки в зависимости от того, какие кнопки были выбраны, нужно было применять различные комбинации валидационных групп.
var validationManager = function () {
// Manual client-side validation of Validator Groups
// an empty string('') is default - to validate controls without a validation group
var valGroups = [''],
returnObj = { //define methods
set: function (/*string argument list*/) {
valGroups = Array.prototype.slice.call(arguments);
return returnObj;
},
add: function (/*string argument list*/) {
var i;
for (i = 0; i < arguments.length; i++) {
if (valGroups.indexOf(arguments[i]) === -1) {
valGroups.push(arguments[i]);
}
}
return returnObj;
},
remove: function (/*string argument list*/) {
var i = 0, n = 0;
for (i = 0; i < arguments.length; i++) {
var n = valGroups.indexOf(arguments[i]);
if (n > -1) valGroups.splice(n, 1);
}
return returnObj;
},
validate: function () {
var i = 0,
summariesToDisplay = [];
for (; i < valGroups.length; i++) {
if (!Page_ClientValidate(valGroups[i])) { //this will display the contents of the validator
summariesToDisplay.push(valGroups[i]);
}
}
if (!summariesToDisplay.length) { return true; }
for (i = 0; i < Page_ValidationSummaries.length; i++) { //make relevant summaries visible
if (summariesToDisplay.indexOf(Page_ValidationSummaries[i].validationGroup || '') > -1) {
Page_ValidationSummaries[i].style.display = "inline"; //"none"; "inline";
}
}
return false;
}
};
if (arguments.length > 0) {
returnObj.set.apply(null, arguments);
}
return returnObj;
}
затем в различных обработчиках событий:
//set up a global object
var validateOnSubmit = validationManager('','BMIvalGrp');
//within a radio click handler
validateOnSubmit.add('weightValGrp','ageValGrp')
.remove('BMIvalGrp');
//added to submit button handlers
validateOnSubmit.validate();
Ответ 5
Здесь нужно сделать простой, очень простой пример:
У вас есть метод javascript ниже в заголовке страницы: -
<script type="text/javascript" language="javascript">
function ShowModalDialog4Validations() {
var x = $find("modalPopupExtenderValidations");
Page_ClientValidate("vgValidations");
if (!Page_IsValid)
x.show();
}
modalPopupExtenderValidations - это идентификатор модального всплывающего окна.
vgValidations - это идентификатор группы проверки.
Теперь в методе prerender страницы добавьте атрибут onclick к вашей кнопке, на которой вы хотите, чтобы проверка выполнялась.
protected void Page_PreRender(object sender, EventArgs e)
{
btnMyButton.Attributes.Add("onclick", "ShowModalDialog4Validations();");
}
Надеюсь, его легко понять.
Bye.
Ответ 6
<b>Lets Say here is u r link button</b>
<asp:LinkButton ID="lnkbtnSubmit" runat="server" OnClientClick="return fnJSOnFormSubmit();" meta:resourcekey="lnkbtnSubmitResource1">Submit</asp:LinkButton>
<b> And u r Script is</b>
<script type="text/javascript">
function confirmAction() {
var retVal = confirm("Are you sure want to continue ?");
if (retVal == true) {
return true;
}
else {
return false;
}
}
function fnJSOnFormSubmit() {
var isGrpOneValid = Page_ClientValidate("updateuser");
var isGrpTwoValid = Page_ClientValidate("BaseKey");
var i;
for (i = 0; i < Page_Validators.length; i++) {
ValidatorValidate(Page_Validators[i]); //this forces validation in all groups
}
isGrpOneValid = Page_ClientValidate("updateuser");
isGrpTwoValid = Page_ClientValidate("BaseKey");
i =0;
for (i = 0; i < Page_Validators.length; i++) {
ValidatorValidate(Page_Validators[i]); //this forces validation in all groups
}
if (isGrpOneValid && isGrpTwoValid)
return true; //postback only when BOTH validations pass.
else
return false;
}
/* determines if a Validation Summary for a given group needs to display */
function fnJSDisplaySummary(valGrp) {
var rtnVal = false;
for (i = 0; i < Page_Validators.length; i++) {
if (Page_Validators[i].validationGroup == valGrp) {
if (!Page_Validators[i].isvalid) { //at least one is not valid.
rtnVal = true;
break; //exit for-loop, we are done.
}
}
}
return rtnVal;
}
</script>