В jQuery, как бы я подождал, пока ASP.NET Multiview не изменит свой ActiveViewIndex через PostBack? - PullRequest
2 голосов
/ 26 апреля 2011

Я работаю в ASP.NET 3.5 с VB.NET в качестве моего серверного языка.Я использую JavaScript через jQuery 1.5.2 в качестве моего клиентского языка.Я пытаюсь выполнить настройку прототипа / пространства имен на этой странице.Эта страница является пользовательской страницей входа с использованием MultiView.У меня есть вид входа в систему и вид забытого пароля.Я храню ActiveViewIndex в скрытом поле с именем currentView.

РЕДАКТИРОВАТЬ: я забыл упомянуть, что я использую частичные обратные передачи с UpdatePanel в этом проекте, и JS не получаетобновлен в Partial PostBacks.

Тем не менее, мне нужен способ подождать, пока ActiveViewIndex будет изменен на стороне сервера, чтобы я мог вызвать функцию init() для соответствующего представления.Возможно ли это?

Если вы хотите взглянуть на мой код на стороне клиента, вот оно, но имейте в виду, что я очень плохо знаком со всем, что касается прототипа / пространства имен, так что не обращайте на меня внимания, если это не так.t правильно или может быть оптимизировано:

Global JS


var page = 
{                   
    currentView : getContentElement( "currentView" ),

    init : function () 
    { 
        log( "initializing page" );

        if ( this.currentView === "forgotpassword" ) { forgotPassword.init(); }
        else { policyLogon.init(); }    
    }
}; 

page.init();

Policy Logon View JS


var policyLogon = 
{                       
    panel              : getContentElement( "pnlLogonInfo", "div" ),
    submitButton       : getContentElement( "btnLogon", this.panel ),
    textInputs         : $( "input[ type=text ]", this.panel ),
    policyNumber       : getContentElement( "txtPolicyNumber", this.textInputs ),
    policyNumberError  : getContentElement( "lblPolicyNumberError", this.panel ),
    password           : getContentElement( "txtPassword", this.textInputs ),
    passwordError      : getContentElement( "lblPasswordError", this.panel ),
    forgotPasswordLink : getContentElement( "lbtnForgotPassword", this.panel ),

    init : function () 
    { 
        log( "initializing policy logon" );

        var that = this;

        // Other event handlers created here [redacted to keep example code short].

        that.forgotPasswordLink.on("click", function () 
        {
            // Code to wait for PostBack should go here.

            page.init();
        });

        that.policyNumber.focus();              
    }
};

Забыл пароль Просмотр JS


var forgotPassword = 
{

    // Local vars, set up the same way as Policy Logon, just different elements.
    // [redacted to keep example code short]

    init : function () 
    { 
        log( "initializing forgot password" );

        var that = this;

        // Other event handlers created here [redacted to keep example code short].

        that.policyNumber.focus();                      
    }    
};


В качестве упреждающего удара по вопросам getContentElement(), getContentElement() - это функция, которую мне пришлось создать из-за вложенных главных страниц, где элементы должны вызываться по-разному в зависимости от того, какая главная страницаони используют.Это выглядит так:

function getContentElement ( id, context ) 
{ 
    var publicPrefix = csMasterPrefix + csContentPrefix,
        securePrefix = cpMasterPrefix + publicPrefix + cpContentPrefix,
        publicId = "#" + publicPrefix + id,
        secureId = "#" + securePrefix + id;

    return ( context )
        ? ( isSecurePage ) ? $( secureId, context ) : $( publicId, context )
        : ( isSecurePage ) ? $( secureId ) : $( publicId );
}

Ответы [ 2 ]

0 голосов
/ 26 апреля 2011

Хорошо ... так что я ответил на мой вопрос, но не с чем-то особенным. Я решил, что могу просто использовать setInterval и постоянно проверять свойство page.currentView. И вместо того, чтобы хранить его постоянно, он всегда будет неопределенным, за исключением случаев, когда page.waitForViewChange устанавливает его изначально.

Изменил мой Global JS на:

var page = 
{                               
    currentView : undefined,
    intervalId  : undefined,

    init : function () 
    { 
        log( "init() fired" );

        this.currentView = getContentElement( "currentView" ).val();
        log( "current view is [" + this.currentView + "]" );

        if ( this.currentView === "forgotpassword" ) { forgotPassword.init(); }
        else { policyLogon.init(); }

        clearInterval( this.intervalId );
        this.intervalId = undefined;
        this.currentView = undefined;
    },

    waitForViewChange : function ( viewToWaitFor ) 
    { 
        log ( "waitForViewChange() fired" );

        this.currentView = getContentElement( "currentView" ).val();
        if ( this.currentView === viewToWaitFor ) { this.init(); }          
    }
};

Затем в моем Policy Logon View JS я изменил событие forgotPasswordLink.click на:

this.forgotPasswordLink.on
(
    "click", 

    function () 
    {     
        page.intervalId = setInterval
        ( 
            'page.waitForViewChange( "forgotpassword" )',
            300 
        ); 
    }
);
0 голосов
/ 26 апреля 2011

Вместо того, чтобы вызывать page.init () сразу, вы должны привязать его к onLoad даже тела.

$(document).ready() { page.init() }

В это время DOM был возвращен с сервера, и ActiveIndexItem также был установлен.

...