Проверка jQuery - Несколько кнопок отправки в одной форме asp.net, разные группы проверки? - PullRequest
0 голосов
/ 21 октября 2009

У меня есть форма asp.net с разделом входа и разделом регистрации. Есть две кнопки отправки, которые соответствуют соответствующему разделу, войдите или зарегистрируйтесь. Я использую проверку jquery, однако я не могу найти способ указать группы проверки, как при обычной проверке asp.net. Когда я нажимаю кнопку регистрации, прямо сейчас она запрашивает заполнение полей для входа. СПАСИБО!

Ответы [ 6 ]

5 голосов
/ 21 октября 2009

Я предполагаю, что вы используете этот плагин проверки: Проверка JQuery . Плагин использует тег формы в качестве группы проверки, поэтому для достижения желаемого вам нужно будет удалить правила в зависимости от того, какую кнопку нажимает пользователь. Кроме того, вам нужно будет добавить правила обратно для случая, когда проверка не пройдена, тогда пользователь решает нажать другую кнопку.

Вот пример:

$(document).ready(function()
{
    $("#form").validate({
        invalidHandler: addRules 
    });        

    addRules();        

    $("#submit1").click(function(){
        $(".group2").each(function(){
            $(this).rules("remove");
        });
    });
    $("#submit2").click(function(){
        $(".group1").each(function(){
            $(this).rules("remove");
        });
    });

});
var addRules = function(){
    $("#input1").rules("add", {required:true});
    $("#input2").rules("add", {required:true});
}

Этот подход позволяет вам добавить атрибут класса (group1 или group2) к каждому из ваших входных данных, который действует как группа проверки.

1 голос
/ 22 октября 2013

Вы всегда можете использовать какой-нибудь простой jquery / javascript для удаления класса «validate [required]» на кнопке asp OnClientClick, а затем добавить его обратно на другие кнопки OnClientClick, что проще, чем изменение файлов проверки валидации или их замена. Примером этого может быть:

<div id="Login">
    <asp:TextBox ID="txtUser" runat="server" CssClass="validate[required]"></asp:TextBox>
    <asp:TextBox ID="txtPass" runat="server" CssClass="validate[required]"></asp:TextBox>
    <asp:Button ID="btnLogin" runat="server" OnClientClick="disableReg();" OnClick="btnLogin_Click" />
</div>
<div id="Register">
    <asp:TextBox ID="txtName" runat="server" CssClass="validate[required]"></asp:TextBox>
    <asp:TextBox ID="txtEmail" runat="server" CssClass="validate[required]"></asp:TextBox>
    <asp:Button ID="btnReg" runat="server" OnClientClick="disableLogin();" OnClick="btnReg_Click" />
</div>

JavaScript будет:

function disableReg() {
    $('#<%=txtName.ClientID%>').removeClass("validate[required]");
    $('#<%=txtEmail.ClientID%>').removeClass("validate[required]");
    $('#<%=txtUser.ClientID%>').addClass("validate[required]");
    $('#<%=txtPass.ClientID%>').addClass("validate[required]");
    return true;
}

function disableLogin() {
    $('#<%=txtUser.ClientID%>').removeClass("validate[required]");
    $('#<%=txtPass.ClientID%>').removeClass("validate[required]");
    $('#<%=txtName.ClientID%>').addClass("validate[required]");
    $('#<%=txtEmail.ClientID%>').addClass("validate[required]");
    return true;
}
1 голос
/ 26 августа 2012

Вместо того, чтобы писать код для конкретной страницы, чтобы обойти эту проблему, вы можете использовать следующую библиотеку:

https://github.com/bbraithwaite/JQueryValidationForWebForms

NB. Исходный код приведен ниже, но ссылка на Github всегда будет иметь самый последний источник.

Он находится поверх jQuery Validation Framework и устраняет эту проблему, используя имена классов в качестве соглашения.

Вы регистрируете событие проверки так же, как проверка JQuery (только под другим именем):

$(function() {
    $("#aspForm").validateWebForm();
});

Пример .ASPX

Базовый пример .aspx с двумя группами проверки может выглядеть следующим образом. Вы просто обернули бы каждый логический раздел и дали бы ему имя класса «form», а для действия, которое должно вызвать событие проверки, просто добавьте класс «submit»:

 <fieldset class="form">
 <div class="something">
 <ul></ul>
 </div>
 <legend>Sign Up</legend>
 <p>
 <asp:Label ID="uiFirstName" runat="server" AssociatedControlID="uxFirstName" Text="First name:"></asp:Label>
 <asp:TextBox ID="uxFirstName" runat="server" CssClass="required"></asp:TextBox>
 </p>
 <p>
 <asp:Button ID="uxRegister" runat="server" Text="Sign Up" CssClass="submit signup" />
 <asp:Button ID="uxCancelRegister" runat="server" Text="Cancel" />
 </p>
 </fieldset>
 <fieldset class="form">
 <legend>Login</legend>
 <p>
 <asp:Label ID="uiUserName" runat="server" AssociatedControlID="uxUserName" Text="User name:"></asp:Label>
 <asp:TextBox ID="uxUserName" runat="server" CssClass="required email"></asp:TextBox>
 </p>
 <p>
 <asp:Button ID="uxLogin" runat="server" Text="Login" CssClass="submit login" />
 <asp:Button ID="uxCancelSignUp" runat="server" Text="Cancel" />
 </p>
 </fieldset>

Исходный код

(function ($) {

    $.extend($.fn, {
        validateWebForm: function (options) {

            var form = $(this[0]),
                formExists = (form.length) && form.is('form');

            if (formExists) {
                if (!options) {
                    options = {};
                }

                // stop the validation from firing on the form submit
                options.onsubmit = false;

                // wire up the default jquery validation event to the form
                this.validate(options);

                // Select any input[type=text] elements within a validation group
                // and attach keydown handlers to all of them.
                $('.form :text').keydown(function (event) {
                    // Only execute validation if the key pressed was enter.
                    if (event.keyCode == 13) {
                        $(event.currentTarget).closest(".form").find(".submit").click();
                    }
                });

                // find the submit buttons and override the click event
                form.getSumbitControls().click(this.validateAndSubmit);

                return this;
            }

            return undefined;
        },
        getSumbitControls: function () {
            return $(this).find('.form .submit');
        },
        getValidationContainer: function (submitControl) {
            return $(submitControl).closest('.form');
        },
        validateAndSubmit: function (event) {
            // Ascend from the button that triggered this click event 
            // until we find a container element flagged with 
            // .validationGroup and store a reference to that element.
            var group = $(this).getValidationContainer(event.currentTarget),
                isValid = true;

            // Descending from that .form element, find any input
            // elements within it, iterate over them, and run validation on 
            // each of them.
            group.find(':input').each(function (i, item) {
                if (!$(item).valid()) {
                    isValid = false;
                }
            });

            // If any fields failed validation, prevent the button's click 
            // event from triggering form submission.
            if (!isValid) {
                event.preventDefault();
            }
        }
    });

})(jQuery);

Nuget Users

PM> Инсталляционный пакет JQuery.Validation.WebForms

Это произошло от прочтения следующего поста Дэйва Уорда:

http://encosia.com/asp-net-webforms-validation-groups-with-jquery-validation/

0 голосов
/ 18 июля 2014

Отслеживайте объект проверки и напрямую удаляйте / заменяйте правила. У меня работает с v1.13.0

var validation = $('#form1').validate(); //Keep track of validation object

//Rule set 1
var validationRulesLogin = {
    headerEmail: {
        required: true,
        email: true
    },
    headerPassword: "required"
};
var validationMessagesLogin = {
    headerEmail: {
        required: "Please enter your email address.",
        email: "Not a valid email address."
    },
    headerPassword: "Please enter your password."
};

//Rule set 2
var validationRulesSignup = {
    signupEmail: {
        required: true,
        email: true
    },
    signupPassword: "required",
    signupPassword2: {
        equalTo: "#phBody_txtNewPassword"
    }
};
var validationMessagesSignup = {
    signupEmail: {
        required: "Please enter your email address.",
        email: "Not a valid email address."
    },
    signupPassword: "Please enter your password.",
    signupPassword2: "Passwords are not the same."
};

//Toggle rule sets on form focus, button click or other event.
function validatingLoginForm(){
    validation.resetForm();
    validation.settings.rules = validationRulesLogin;
    validation.settings.messages = validationMessagesLogin;
}
function validationSignupForm(){
    validation.resetForm();
    validation.settings.rules = validationRulesSignup;
    validation.settings.messages = validationMessagesSignup;
}
0 голосов
/ 07 ноября 2012

если вы используете ненавязчивую проверку jquery, в качестве альтернативы вы можете использовать это:

$(document).ready(function () {

    var formValidator = $("form").validate();

    $("#btnLogin").click(function () {
        formValidator.settings.ignore = "#registerSection *";
    });

    $("#btnRegister").click(function () {
        formValidator.settings.ignore = "#loginSection *";
    });
});
0 голосов
/ 22 октября 2009

Сделайте логику проверки сервера ASP.NET доступной на стороне клиента / jQuery, прикрепив специальные имена классов CSS к элементам HTML, представляющим элементы управления проверки на стороне сервера.

Имена классов CSS будут представлять группы проверки. Поэтому, например, некоторые текстовые поля будут помечены именем класса для одной группы проверки, а другие текстовые поля - для другой группы проверки.

Например, напишите и вызовите эту функцию C # в обработчике PreRender страницы или перед тем, как страница будет отображена для наполнения серверных элементов управления специальным CSS.

/// <summary>
/// Makes the server validation logic knowledge available to the client side
/// by appending css class names to validators and html elements being validated.
/// The generated css classes can be targeted by jQuery in the DOM.
/// </summary>
/// <param name="cssPrefixValidator">prefix string for validator css names</param>
/// <param name="cssPrefixTarget">prefix string for target element css names</param>
/// <remarks>
/// The css prefix arguments to this function help distinguish between what is a 
/// validation control and what is an html element being targeted by said validation control.
/// </remarks>
/// 
void TagValidationWithCss(string cssPrefixValidator, string cssPrefixTarget) {

    List<string> valClasses = new List<string>();
    List<string> targetClasses = new List<string>();

    // iterate over validator server controls
    foreach (BaseValidator val in Page.Validators) {

        // keep a unique list of generated validator css class names
        string classnameVal = cssPrefixValidator + val.ValidationGroup;
        if (!valClasses.Contains(classnameVal))
            valClasses.Add(classnameVal);
        // ..and mark the validator element with the generated css class name
        val.CssClass += (string.IsNullOrEmpty(val.CssClass) ? "" : " ") + classnameVal;

        // keep a unique list of generated target element css class names
        string classnameTarg = cssPrefixTarget + val.ValidationGroup;
        if (!targetClasses.Contains(classnameTarg))
            targetClasses.Add(classnameTarg);
        // ..and mark the target element with the generated css class name
        Control target = FindControl(val.ControlToValidate);
        if (target is HtmlControl)
            ((HtmlControl)target).Attributes["class"] += (string.IsNullOrEmpty(val.CssClass) ? "" : " ") + classnameTarg;
        else if (target is WebControl)
            ((WebControl)target).CssClass += (string.IsNullOrEmpty(val.CssClass) ? "" : " ") + classnameTarg;
    }

    // output client script having array of validator css names representing validation groups
    string jscriptVal = string.Format("<script>window['{1}'] = ['{0}'];</script>", string.Join("','", valClasses.ToArray()), cssPrefixValidator);
    ClientScript.RegisterStartupScript(this.GetType(), "val", jscriptVal);

    //output client script having array of html element class names representing validation groups
    string jscriptTarg = string.Format("<script>window['{1}'] = ['{0}'];</script>", string.Join("','", targetClasses.ToArray()), cssPrefixTarget);
    ClientScript.RegisterStartupScript(this.GetType(), "targ", jscriptTarg);
}

Функция вызывается на серверной странице:

protected override void OnPreRender(EventArgs e) {
    base.OnPreRender(e);

    TagValidationWithCss("validator-", "target-");
}

Декларативный синтаксис страницы ASPX может иметь два раздела:

<div>

Login Section
    <asp:TextBox ValidationGroup="vg1" ID="TextBox1" runat="server"></asp:TextBox><asp:TextBox
        ValidationGroup="vg1" ID="Textbox2" runat="server"></asp:TextBox><asp:Button ID="Button1"
            ValidationGroup="vg1" runat="server" Text="Button" />
    <asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" ControlToValidate="TextBox1"
        ErrorMessage="RequiredFieldValidator" ValidationGroup="vg1"></asp:RequiredFieldValidator>
    <asp:RequiredFieldValidator ID="RequiredFieldValidator4" runat="server" ControlToValidate="Textbox2"
        ErrorMessage="RequiredFieldValidator" ValidationGroup="vg1"></asp:RequiredFieldValidator>

    <hr />

Registration Section
    <asp:TextBox ValidationGroup="vg2" ID="TextBox4" runat="server"></asp:TextBox><asp:TextBox
        ValidationGroup="vg2" ID="Textbox5" runat="server"></asp:TextBox><asp:Button ID="Button3"
            ValidationGroup="vg2" runat="server" Text="Button" />
</div>

Теперь перейдем к отображаемой странице, чтобы увидеть результаты .....

Источник HTML страницы содержит массивы сгенерированных имен CSS, представляющих группы валидации, один набор для валидаторов (validator-) и другой для целей валидации (target -)

<script>window['validator-'] = ['validator-vg1','validator-vg2'];</script>
<script>window['target-'] = ['target-vg1','target-vg2'];</script> 

Эти имена CSS также отображаются в элементах html. Обратите внимание на CSS-классы "target-vg1" в текстовых полях, представляющие группу проверки # 1. Текстовые поля представляют экран / интерфейс входа в систему на странице (одна из двух частей пользовательского интерфейса):

<input name="TextBox1" type="text" id="TextBox1" class=" target-vg1" /><input name="Textbox2" type="text" id="Textbox2" class=" target-vg1" /><input type="submit" name="Button1" value="Button" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;Button1&quot;, &quot;&quot;, true, &quot;vg1&quot;, &quot;&quot;, false, false))" id="Button1" /> 

Этот второй набор текстовых полей находится на той же странице ASP.NET (в той же форме ASP.NET) и представляет экран / интерфейс регистрации пользователя (вторая часть пользовательского интерфейса). Обратите внимание, что эти текстовые поля помечены другой группой проверки с именем "target-vg2" в классе css.

 <input name="TextBox4" type="text" id="TextBox4" class=" target-vg2" /><input name="Textbox5" type="text" id="Textbox5" class=" target-vg2" /><input type="submit" name="Button3" value="Button" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;Button3&quot;, &quot;&quot;, true, &quot;vg2&quot;, &quot;&quot;, false, false))" id="Button3" /> 

Таким образом, мы внедрили специальные имена Css в поток ASP.NET, не прерывая и не прерывая его.

В конечном итоге этот специализированный вывод позволяет вам писать собственные сценарии для него (т. Е. Используя jQuery), чтобы использовать эти специальные имена классов CSS и различать группы проверки на стороне клиента.

Этот простой пример предупреждает имена групп проверки на стороне клиента, чтобы доказать, что они видны и известны. Уф!

<script>
    // Tell the CSS names of the available validation groups assigned to target elements.
    var strGroups = 'css validation groups are: ' + window['target-'].join(', ');
    alert(strGroups);
</script>

jQuery можно использовать и для специальных классов CSS.

Это не охватывает все случаи. Это может быть действительно на обед, но было интересно сделать. Код на стороне сервера и клиента должен быть настроен под личный или проектный вкус.

(Вы также хотите полагаться на тот факт, что более новые браузеры могут применять несколько классов CSS к одному элементу, используя атрибут 'class', разделяя имена классов пробелами, например - class = "vg1 animated bright myclass your class". сгенерированные имена классов CSS, которые будут добавлены после существующих имен классов без их перезаписи.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...