Запустите функцию jQuery на PostBack (ASP.NET) - PullRequest
8 голосов
/ 19 июня 2011

У меня есть форма, которая изначально скрыта через jQuery, и при нажатии кнопки появляются две радиокнопки (также изначально скрытые через jQuery). При нажатии одной радиокнопки пользователь перенаправляется на другую страницу (это работает нормально). При нажатии на другую радиокнопку «форма» снова становится видимой через jQuery.

Моя проблема возникает, когда поле в «форме» проверяется на стороне сервера при отправке, и страница перезагружается с видимым сообщением об ошибке проверки, НО «форма» теперь скрыта (согласно исходному jQuery ниже).

Как сделать форму видимой при обратной передаче? (Я уже пробовал ASP Panels & AJAX UpdatePanel безрезультатно.)

** Это мой JQuery: **

// Reveal Radio Fields
      $(".btn-leavecomment, .txt-leavecomment").toggle(function(){   
            $("#commenttype").stop().animate({ down: "+=300" }, 3000)      
            $("#commenttype").stop().slideDown("slow");      
       }, function(){
            $("#commenttype").stop().animate({ down: "-=300" }, 1400)      
            $("#commenttype").stop().slideUp("slow");  
      });     


      // Reveal Form on-click of one radio field in particular
      $(".reveal_ccform").toggle(function(){   
            $("#ccform_container").stop().animate({ down: "+=300" }, 4000)      
            $("#ccform_container").stop().slideDown("slow:4000");      
       }, function(){
            $("#ccform_container").stop().animate({ down: "-=300" }, 4000)      
            $("#ccform_container").stop().slideUp("slow:4000");
      }); 

Недавно добавленная реализация JavaScript (согласно предложению Моара), это все еще не работает, есть идеи? :(:

JavaScript:

<script type="text/javascript">
        $(document).ready() {
            function isPostBack() 
            {
                if (!document.getElementById('clientSideIsPostBack'))
                {
                    return false;

                    if (document.getElementById('clientSideIsPostBack').value == 'Y' )
                    return true;
                    }

                // Reveal Comment Type
                $(".btn-leavecomment, .txt-leavecomment").toggle(function () {
                    $("#commenttype").stop().animate({ down: "+=300" }, 3000)
                    $("#commenttype").stop().slideDown("slow");
                }, function () {
                    $("#commenttype").stop().animate({ down: "-=300" }, 1400)
                    $("#commenttype").stop().slideUp("slow");
                });


                // Reveal Sign Guestbook Form
                $(".reveal_ccform").toggle(function () {
                    $("#ccform_container").stop().animate({ down: "+=300" }, 4000)
                    $("#ccform_container").stop().slideDown("slow:4000");
                }, function () {
                    $("#ccform_container").stop().animate({ down: "-=300" }, 4000)
                    $("#ccform_container").stop().slideUp("slow:4000");
                });

                // Hide 'Leave a Comment' button and 'Comment Type' div
                $('.reveal_ccform').click(function () {
                    $(".btn-leavecomment").stop().fadeOut("slow:1500"),
                    $('#commenttype').slideUp("slow:8000");
                });
            }
        }
    </script>

C #:

if (Page.IsPostBack)
        {
            Page.ClientScript.RegisterStartupScript(GetType(), "IsPostBack", script, true);

            //Second part of code will run if is postback = true
            ClientScriptManager cs = Page.ClientScript;
            Type csType = this.GetType();
            cs.RegisterClientScriptBlock(csType, "openForms",     "$(document).ready(openForms);", true);
        }  

Ответы [ 3 ]

5 голосов
/ 07 июля 2011

Это может звучать довольно раздражающе, но для достижения этой цели

Я бы использовал скрытые значения Скажем, когда вы открываете форму, обновите скрытое значение до 1,

Страница HTML

input type="hidden" id="hiddenFormOpen" value="1" runat="server"

C # код позади

if (IsPostBack)
    ClientScriptManager.RegisterClientScriptBlock(this.GetType, "myFunction",
        "openForm("+hiddenFormOpen+")", true);

Функция Javascript

function openForm (val)
{
    if (val ==1)
    {
        Update form visibility here
    }
}

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

3 голосов
/ 19 июня 2011

Я бы порекомендовал поместить весь javascript, который вы показали, в функцию. Для примера расскажем, что вы поместили его в функцию с именем

myFunction();

Затем, в вашем коде, поместите это в одно из событий страницы (я бы порекомендовал page_load)

if (IsPostBack)
    ClientScriptManager.RegisterClientScriptBlock(this.GetType, "myFunction", "$(document).ready(myFunction);", true);

Это вставит JavaScript на страницу, которая будет запускать вашу функцию, только если страница является отправкой назад.

1 голос
/ 19 июня 2011

При возникновении обратной передачи любые изменения, внесенные вами на страницу через jQuery, будут потеряны.

Я не уверен, используете ли вы UpdatePanels, но в этом случае возникают дополнительные проблемы. Прочитайте это: jQuery $ (документ) .ready и UpdatePanels?

Если вы не используете UpdatePanels, я бы сказал, что вам просто нужно сделать форму видимой на стороне сервера во время обратной передачи (form.visible).

Модель веб-форм asp.net действительно полезна, однако она явно не была разработана с учетом jQuery. На мой взгляд, если вы хотите максимально использовать подход типа Web 2.0, вы можете подумать об отказе от использования postbacks / updatepanels и о большей работе с веб-сервисами и так далее ... Лично это определенно тянет меня неумолимо по отношению к MVC.

...