Странная ошибка при объединении ASP.NET updatepanel с jQuery UI DatePicker

Можно совместно использовать сокет между два (или больше) процессы в Linux и даже Windows.

В соответствии с Linux (Или POSIX вводят ОС), с помощью fork() заставит разветвленного ребенка иметь копии дескрипторов файлов всего родителя. Любой, что это не закрывается, продолжит совместно использоваться, и (например, с TCP, слушая сокет) может привыкнуть к accept() новые сокеты для клиентов. Это то, сколько серверов, включая Apache в большинстве случаев, работу.

В Windows то же самое в основном верно, кроме нет никакого fork() системный вызов, таким образом, родительский процесс должен будет использовать CreateProcess или что-то для создания дочернего процесса (который может, конечно, использовать тот же исполняемый файл), и должен передать его наследуемый дескриптор.

Создание слушания снабдить наследуемый дескриптор сокетом не является абсолютно тривиальным действием, но не слишком хитрое также. DuplicateHandle() потребности, которые будут использоваться для создания дублирующегося дескриптора (все еще в родительском процессе однако), который будет иметь наследуемый набор флага на нем. Тогда можно дать тот дескриптор в STARTUPINFO структура к дочернему процессу в CreateProcess как STDIN, OUT или ERR дескриптор (предполагающий, что Вы не хотели использовать его для чего-либо еще).

РЕДАКТИРОВАНИЕ:

Чтение библиотеки MDSN, кажется, что WSADuplicateSocket более устойчивый или корректный механизм выполнения этого; это все еще нетривиально, потому что родитель/дочерние процессы должен удаться, какой дескриптор должен быть дублирован некоторым механизмом IPC (хотя это могло быть столь же просто как файл в файловой системе)

РАЗЪЯСНЕНИЕ:

В ответе на исходный вопрос OP, нет, несколько процессов не могут bind(); просто исходный родительский процесс звонил бы bind(), listen() и т.д., дочерние процессы просто обработают запросы [1 113], send(), recv() и т.д.

8
задан marc_s 25 February 2017 в 18:10
поделиться

10 ответов

Думаю, вам интересна эта статья из MSDN: http://msdn.microsoft.com/en-us/magazine/cc163413.aspx

В статье говорится, что «Sys.WebForms.PageRequestManager.getInstance (). add_pageLoaded (» также присоединяется к событиям завершения Updatepanel.

Он также срабатывает каждый раз, когда выполняется запущен асинхронный обратный вызов от имени элемента управления UpdatePanel завершает и содержимое внутри этого UpdatePanel обновляется.

затем в вашем обработчике вы можете прокручивать обновленные панели с помощью

var panels = args.get_panelsUpdated();
for (i=0; i < panels.length; i++) { alert(panels[i]); }

. Я бы отклонился от использования _ postBackSettings, потому что "_" обозначает конфиденциальность и может быть прекращен в будущих версиях asp.net ajax .

4
ответ дан 5 December 2019 в 23:16
поделиться

Общая проблема с комбинациями AJAX и jQuery заключается в том, что это ...

$(document).ready(function() {
       buildDatepicker();

Происходит только при загрузке первой страницы. Если вы замените область HTML, на которую повлияла buildDatapicker (); вы потеряли все связанные с ним события (даже если вы заменили его теми же элементами).

Все, что вам нужно сделать, это вызвать buildDatepicker для только что загруженного HTML ... и передать элемент, который был загружен только для того, чтобы убедиться, что вы не удвоились ...

$(document).ready(function() {
       buildDatepicker(document);
...

function buildDatepicker(element) {
    var dp = $("#datepicker", element).datepicker({
        onSelect: function(dateText, inst) {
            /* Do a postback when someone clicks a date */
            doAspNetPostback();
        }
    });
}    

Теперь вы можете вызвать buildDatepicker (myNewlyLoadedElement); для повторного связывания функции выбора данных.

0
ответ дан 5 December 2019 в 23:16
поделиться

Я исправил различные проблемы с асинхронностью в jQuery / Updatepanels, используя аргумент ScriptMode = "Release" в ScriptManager.

  <asp:ScriptManager ID="scriptManager" runat="server" ScriptMode="Release">
  </asp:ScriptManager>
1
ответ дан 5 December 2019 в 23:16
поделиться

You could try using datepicker to set an altField and check that for changes to do a postback.

0
ответ дан 5 December 2019 в 23:16
поделиться

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

 <script type="text/javascript">
        /*
        [__doPostBackAsync]
        Will send an async postback to the backend
        */
        function __doPostBackAsync(eventName, eventArgs) {
            var prm = Sys.WebForms.PageRequestManager.getInstance();

            //check first if the request queues have this item
            if (!Array.contains(prm._asyncPostBackControlIDs, eventName)) {
                prm._asyncPostBackControlIDs.push(eventName);
            }
            if (!Array.contains(prm._asyncPostBackControlClientIDs, eventName)) {
                prm._asyncPostBackControlClientIDs.push(eventName);
            }
            __doPostBack(eventName, eventArgs);
        }
    </script>

Вы по-прежнему можете вручную установить функцию обратного вызова, точно так же, как в приведенном выше сценарии.

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

0
ответ дан 5 December 2019 в 23:16
поделиться

Похоже на состояние гонки, попробуйте UpdateMode = "Conditional" и ChildrenAsTriggers = "false", ссылка .

0
ответ дан 5 December 2019 в 23:16
поделиться

Я попробовал ваш код для воспроизведения ошибки и могу воспроизвести ошибку. И я пришел к выводу, что есть проблема с jQuery / UpdatePanels.

Если я заменю кнопку LinkButton, вы увидите, что ссылка напрямую вызывает __doPostBack (...), ту же самую функцию с те же самые аргументы, которые вы вызываете. И нажатие кнопки ссылки работает напрямую, а щелчок по дате - нет.

Это означает, что внутри jQuery происходит что-то, что меняет некоторый контекст. Но я понятия не имею, что это будет.

0
ответ дан 5 December 2019 в 23:16
поделиться

Однако, если я перейду через код в FireBug работает достаточно медленно

А? Почему бы не дать ему секунду, чтобы разобраться?

setTimeout(function(){alert(sender._postBackSettings.panelID);},1000);
0
ответ дан 5 December 2019 в 23:16
поделиться

Мне понравился ответ Тима, окружающий идею о том, что вы должны использовать args.get_PanelsUpdated () в событии pageLoaded. Кажется, это подходящее средство для того, что вы пытаетесь сделать. Попробуйте - если не сработает, значит, у меня в рукаве есть еще одна идея (хотя и грязная).

0
ответ дан 5 December 2019 в 23:16
поделиться

Я подумал, что это интересно, если вы добавите предупреждение после doPostBack, тогда FF не вернет значение null.

    function doAspNetPostback() {

        __doPostBack('<%= hiddenOnSelectionChangedButton.ClientID %>', '');
        alert('<%= hiddenOnSelectionChangedButton.ClientID %>');
    }
0
ответ дан 5 December 2019 в 23:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: