Как заново зарегистрироваться динамические скрипты зарегистрирована ClientScriptManager в АСП точка net с помощью сессии было плохой идеей


После обычной модели добавляя встроенные скрипты для GridView в строке/S-это плохая практика, она используется для работы, как показано ниже

 protected void CustomersGrid_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        switch (e.Row.RowType)
        {
            case DataControlRowType.DataRow:
                DataRowView drv = (DataRowView)e.Row.DataItem;
                if (drv != null)
                {
                    string sKey = drv["Id"].ToString();                                e.Row.Attributes.Add("onclick","location.href='manage.aspx?="+sKey+"'");
                }
                break;         
        }
    }

поэтому я переключился на шаблон регистрации событий, которая работала как ниже

protected void CustomersGrid_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        switch (e.Row.RowType)
        {
            case DataControlRowType.Header:
                StringBuilder _sbDynamicScript = new StringBuilder();
                _sbDynamicScript.AppendLine("Sys.Application.add_load(function(){");
                _sbDynamicScript.AppendLine("try{");
                break;
            case DataControlRowType.DataRow:
                DataRowView drv = (DataRowView)e.Row.DataItem;
                if (drv != null)
                {
                    string sKey = drv["Id"].ToString();
                    e.Row.Attributes.Add("id", randomNumber);
                    _sbDynamicScript.AppendLine("if($get('" + randomNumber + "'))$addHandler($get('" + randomNumber + "'),'click',function(evnt){location.href='manage.aspx?id='="+ sKey +"'})");
                }
                break;
            case DataControlRowType.Footer:
                _sbDynamicScript.AppendLine("}catch(err){alert(err.message)}})");
                if (!Page.ClientScript.IsStartupScriptRegistered(GetType(), "customerapp"))
                {
                    Page.ClientScript.RegisterStartupScript(GetType(), "customerapp", _sbDynamicScript.ToString(), true);
                }
                Session["clientScript"] = _sbDynamicScript.ToString();
                break;
        }
    }

уведомление rowType используется для создания динамического сценария. Вот то, что происходит там

1.добавить случайное число в качестве ID для GridView в строке

2.затем добавьте обработчик события click с помощью asp.net Аякс

  1. сделать переход по клику

Ахой ошибки:

Обратите внимание, что в шаблоне футера я поставил этот скрипт на сессию, это было моей ошибкой. Вы видите сценарии зарегистрированы, используя registerstartup скрипт не сохраняется на обратной передачи и должны быть повторно зарегистрированы. я поставил галочку на PageLoad сделать ниже

 if (!Page.ClientScript.IsStartupScriptRegistered(GetType(), ""))
            {
                Page.ClientScript.RegisterStartupScript(GetType(), "customerapp", Session["clientScript"].ToString(), true);
            }

заметьте, сценарий прописан от сессия!! Ну бывает несколько раз что в GridView записи изменен на обратной передачи. Но после сессии уже ключ в нем, сценарий rowdatabound событие не удается получить зарегистрирован новый сценарий. Так что мне делать в этой ситуации. Я могу получить некоторые другого пути для сохранения сценария и запустить его всякий раз, когда GridView в персонализация снова

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

Sys.Application.add_load(function () {
    try {
        if ($get('ElSxrM4myH4%3d')) {
            $addHandler($get('ElSxrM4myH4%3d'), 'click', function (evnt) {})
        }
    } catch (err) {
        alert(err.message)
    }
})


Комментарии
1 ответ

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

С помощью jQuery, вы могли бы достичь что-то вроде:

$(function() {
$("tr.needEvent td").live(function() {
// Event handler code goes here.
});
});

где тр.needEvent - класс прилагается к используется, чтобы обернуть ряд. Если вы не используете таблицы, это может быть использовано таким же образом с

или любой другой элемент-контейнер. Самое главное, что используя .видео() мы можем выполнить код один раз, и любые другие elemnets добавлены на страницу, которые соответствуют селектор, будет привязан к событию обработчик автоматически.

Использование $(функция() { это в jQuery эквивалент Сыс.Приложения.add_load(функция() {

1
ответ дан 2 июня 2011 в 05:06 Источник Поделиться