Элементы, сохраняющие исходные значения в объектах jQuery после PostBack - PullRequest
3 голосов
/ 26 мая 2011

Я использую ASP.NET 3.5 в сочетании с ужасными UpdatePanel , jQuery.delegate() и JavaScript литералами объектов.

Я использую jQuery.delegate() для сохранения обработчиков событий, которые запускаются после PostBack , как и ожидалось.

Проблема связана с объектами jQuery , хранящимися в свойствах литералов объектов в init(), где они сохраняют значения, которые были до ASP.NET PostBack .

Вот мой JavaScript :


SFAIC


SFAIC = 
{
    masterPages: { cs: "CS_", cp: "CP_" },
    contentPages: { cs: "CSContent_", cp: "CPContent_" },

    isSecurePage  : false,

    $body         : undefined,
    $container    : undefined,
    $updatePanel  : undefined,

    $textBox      : undefined,
    $errorLabel   : undefined
};


SFAIC.init ()


SFAIC.init = function () 
{ 
    log( "--> SFAIC.init() fired" );

    var self = this; 

    self.$body        = $( "body" );
    self.$container   = self.$body.find( "#container" );
    self.$updatePanel = self.getCSMasterElement( "UpdatePanel1", self.$container );
    self.$textBox     = self.getContentElement( "TextBox1" );
    self.$errorLabel  = self.getContentElement( "ErrorLabel1" );

    self.$updatePanel.delegate( self.$textBox.selector, "blur", function () 
    { 
       self.validateRequired( self.$textBox, self.$errorLabel ); 
    });

    self.$textBox.focus();
};


SFAIC.validateRequired ()


SFAIC.validateRequired = function ( $element, $errorLabel ) 
{
    if ( $element.val().length === 0 ) { $errorLabel.text( "Required" ); }
    else { $errorLabel.text( "" ); }
};



Учитывая вышеизложенное, когда запускается SFAIC.init(), self.textBox назначается его объекту jQuery. Я предполагаю, что в этом заключается мое замешательство. Я думал, что когда вы вызываете .val(), он сразу вернет значение того, что находится в этом элементе. В случае, когда вы делаете вызов серверу и изменяете значение элемента управления, который затем возвращается, отображая измененное значение элемента, кажется, что объект jQuery не знает об этом изменении?

Я здесь не прав?

Что мне нужно сделать, чтобы сохранить в реальном времени ссылку на элемент, чтобы я мог получить текущее значение после публикации страницы?


Запрос на редактирование за @ DaveLong :


SFAIC.getCSMasterElement ()


SFAIC.getCSMasterElement = function ( id, $context ) 
{ 
    return SFAIC.getElement( SFAIC.masterPages.cs, id, $context ); 
};


SFAIC.getCPMasterElement ()


SFAIC.getCPMasterElement = function ( id, $context ) 
{ 
    return SFAIC.getElement( SFAIC.masterPages.cp, id, $context ); 
};


SFAIC.getContentElement ()


SFAIC.getContentElement = function ( id, $context ) 
{ 
    return SFAIC.getElement
    ( 
        ( SFAIC.isSecurePage ) ? SFAIC.contentPages.cp : SFAIC.contentPages.cs, 
        id, 
        $context 
    ); 
};


SFAIC.getElement ()


SFAIC.getElement = function ( page, id, $context ) 
{
    selector = SFAIC.getElementIdSelector( page, id );

    return ( selector ) 
        ? ( $context && $context.length ) 
            ? $context.find( selector ) 
            : SFAIC.$body.find( selector )
        : undefined;
};


SFAIC.getElementIdSelector ()


SFAIC.getElementIdSelector = function ( page, id ) 
{ 
    var prefix = SFAIC.getElementPrefix( page );
    return ( prefix && id ) ? "#" + prefix + id : undefined;
};


SFAIC.getElementPrefix ()


SFAIC.getElementPrefix = function ( page ) 
{   
    switch ( page ) 
    {
        case SFAIC.masterPages.cs : return SFAIC.masterPages.cs;
        case SFAIC.masterPages.cp : return SFAIC.masterPages.cp + SFAIC.masterPages.cs;
        case SFAIC.contentPages.cs : return SFAIC.masterPages.cs + SFAIC.contentPages.cs;
        case SFAIC.contentPages.cp : return SFAIC.masterPages.cp + SFAIC.masterPages.cs + SFAIC.contentPages.cs + SFAIC.contentPages.cp;                
    }
};

Ответы [ 3 ]

4 голосов
/ 12 июня 2011

UpdatePanel удаляет всю цель из DOM и заменяет ее новой разметкой из ответа.Дело не в том, что ваши переменные содержат старые значения, а в том, что они содержат ссылки на исходную разметку.Вам необходимо выполнить «повторную инициализацию», чтобы получить ссылки на новые узлы в DOM.

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

возможно, вам следует заново инициализировать объекты, когда запрос ajax updatepanel завершится

<script type="text/javascript" language="javascript">
     Sys.WebForms.PageRequestManager.getInstance().add_endRequest(ReInitiate); 
     function ReInitiate(sender, args)
     {
        //re-initialize the objects 
        //add code here 
     } 
</script>

Ура, Нитин

0 голосов
/ 23 июня 2011

Для чего бы это ни стоило, решение, которое я придумал, было настроенной версией Полного Ирриша ненавязчивого всестороннего готового к DOM выполнения выполнения и @NitinJS '/ @ Итана.

В нижней части моего JavaScript я добавил:

UTIL = {

    fire : function(func, funcname) {

        var namespace = SFAIC;
        funcname = (funcname === undefined) ? "init" : funcname;

        if (func !== "" && 
            namespace[func] && 
            typeof namespace[func][funcname] == "function") { 

            namespace[func][funcname](); 

        }

    },

    loadEvents : function() {

        var bodyId = document.body.id;

        UTIL.fire("common");
        UTIL.fire(bodyId);

    }

};

// Fire events on initial page load.
UTIL.loadEvents();

// Fire events for partial postbacks.
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(UTIL.loadEvents);

В aspx моей MasterPage я изменил тег body:

<body id="<%=bodyId%>">

В декларациях кода моего MasterPage я добавил:

Public bodyId As String = String.Empty

В обработчике Page.PreRender моего кода MasterPage я добавил:

bodyId = MyBase.GetType.BaseType.Name
...