ASP.NET с jQueryUI: серверное событие не запускается - PullRequest
3 голосов
/ 18 мая 2009

У меня есть страница ASP.NET, где страница использует диалоговое окно jQuery UI. Когда пользователь нажимает кнопку (btnGo) на странице, я проверю, вошел ли пользователь в систему или нет. Если бы не войти в систему, я бы показал диалоговое окно jQuery UI для входа. Я использовал этот код:

<body>
<form id="form1" runat="server">
<div>
   <br />  
    <asp:TextBox ID="txtModelId" runat="server" Text="12"></asp:TextBox><br />

   <asp:Button ID="btnGo" runat="server" Text="Go" OnClick="btnGo_Click" />
    <br />
    <asp:Label ID="lblUserMsg" runat="server" Text="Label"></asp:Label></div>
    <div id="divContentHolder">
    <div class="demo">

    <div id="dialog" title="Login with your User Account">
    <p id="validateTips">Enter your EmailId & password</p>


    <fieldset>

    <label for="email">Email</label>
    <input type="text" name="email" id="email" value="" class="text ui-widget-content ui-corner-all" />
    <label for="password">Password</label>
    <asp:TextBox ID="txtFirstName" CssClass="text ui-widget-content ui-corner-all" runat="server" Text=""></asp:TextBox>
  <!-- &nbsp;<asp:Button   ID="btnSingIn" runat="server" OnClick="btnSingIn_Click" Text="Button" /><br />-->
    <asp:Button ID="btnLogin" runat="server" Text="Login" OnClick="btnLogin_Click" />
    </fieldset>

    </div><!--dialog-->
    </div><!--demo-->
   </div><!--divContentHolder-->

</form>

А на стороне сервера:

protected void btnGo_Click(object sender, EventArgs e)
    {
        CheckUserLoggedIn();
    }

private void CheckUserLoggedIn()
    {
        if (Session["username"] != null)
        {
            Response.Write("Logged in user");
            ClientScript.RegisterHiddenField("isAuthenticated", "true");
        }
        else
        {
            ClientScript.RegisterHiddenField("isAuthenticated", "false");
        }
    }

Приведенный выше код работает нормально. Если пользователь не вошел в систему, он покажет JQuery UI Диалог для входа. Но проблема в том, что функция на стороне сервера btnLogin_Click() (событие нажатия кнопки ASP.NET btnLogin) не срабатывает. Я попробовал это на другой тестовой странице, поместив тег формы перед полевым набором, и это сработало. Пример:

<form id="form1" runat="server">
 <fieldset>  then  rest of the items...(text box and button)

Но я не могу сделать это на первой странице, потому что, если я помещу тег формы непосредственно перед набором полей, мое текстовое поле и кнопка Other ASP.NET будут вне формы, и при попытке запустить это показывая ошибку, сообщая, что элемент управления txt box должен быть в форме.

Я знаю, что мы не можем использовать несколько форм на этой странице с runat="server".

Какое решение для этой проблемы?

Код JavaScript:

<script type="text/javascript">
$(function() {

    var name = $("#name"),
        email = $("#email"),
        password = $("#password"),
        allFields = $([]).add(name).add(email).add(password),
        tips = $("#validateTips");

    function updateTips(t) {
        tips.text(t).effect("highlight",{},1500);
    }

    function checkLength(o,n,min,max) {

        if ( o.val().length > max || o.val().length < min ) {
            o.addClass('ui-state-error');
            updateTips("Length of " + n + " must be between "+min+" and "+max+".");
            return false;
        } else {
            return true;
        }

    }

    function checkRegexp(o,regexp,n) {

        if ( !( regexp.test( o.val() ) ) ) {
            o.addClass('ui-state-error');
            updateTips(n);
            return false;
        } else {
            return true;
        }

    }

    $("#dialog").dialog({
        bgiframe: true,
        autoOpen: false,
        height: 300,
        modal: true,
        buttons: {
            'Create an account': function() {
                var bValid = true;
                allFields.removeClass('ui-state-error');

                bValid=true;
                if (bValid) {

                    /*$('#users tbody').append('<tr>' +
                        '<td>' + name.val() + '</td>' + 
                        '<td>' + email.val() + '</td>' + 
                        '<td>' + password.val() + '</td>' +
                        '</tr>'); */

                        alert("Check User Credentials")
                    $(this).dialog('close');
                }
            },
            Cancel: function() {
                $(this).dialog('close');
            }
        },
        close: function() {
            allFields.val('').removeClass('ui-state-error');
        }
    });



    $('#create-user').click(function() {
        $('#dialog').dialog('open');
    })
    .hover(
        function(){ 
            $(this).addClass("ui-state-hover"); 
        },
        function(){ 
            $(this).removeClass("ui-state-hover"); 
        }
    ).mousedown(function(){
        $(this).addClass("ui-state-active"); 
    })
    .mouseup(function(){
            $(this).removeClass("ui-state-active");
    });

//});
var isAuthenticated = $("#isAuthenticated").val();
if (isAuthenticated && isAuthenticated == "false")
{
// Display the modal dialog.
$("#dialog").dialog("open");
}
});
</script>

Ответы [ 2 ]

10 голосов
/ 18 мая 2009

Попробуйте установить UseSubmitBehavior=false на кнопке управления. Видимо, виджет jQuery BlockUI изменяет поведение кнопки, и он не отправляется правильно.

См .: http://encosia.com/2008/10/04/using-jquery-to-enhance-aspnet-ajax-progress-indication/

2 голосов
/ 15 ноября 2009

хорошо используйте эти инструкции, я нашел их очень полезными:

http://relativelypositioned.wordpress.com/2008/11/14/jquery-dialog-aspnet-no-postback/

и конкретно:

uiDialog.parent().appendTo('/html/body/form[0]');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...