User control with server tag FORM and PostBack
От: SunComp  
Дата: 25.12.03 13:57
Оценка:
User control with server tag FORM and custom function __doPostBack(...)

Вопрос:

Можно ли заставить ASP.NET не генерить клиентский скрипт с
function __doPostBack(eventTarget, eventArgument)?

Предыстория:

Увидел неплохую статью на http://www.gotdotnet.ru
"Использование Web User Controls для построения шаблонов страниц в ASP.Net"
здесь
автор Иванов Роман Сергеевич

Если вкратце, то суть идеи сводится к созданию DefaultTemplate.ascx контрола
в котором помещается тег <form runat="server"> ... </form>
и несколько PlaceHolder controls (для последующей загрузки в них других
User Controls — this.TopPlaceHolder.Controls.Add(Page.LoadControl(this.topModuleUrl))

например:

<form runat="server">
...
<asp:PlaceHolder Runat="server" ID="TopPlaceHolder"></asp:PlaceHolder>
...
<asp:PlaceHolder Runat="server" ID="LeftPlaceHolder"></asp:PlaceHolder>
...
<asp:PlaceHolder Runat="server" ID="RightPlaceHolder"></asp:PlaceHolder>
...
</form>

Дальше помещаем этот DefaultTemplate.ascx контрол на любую .aspx страницу

например так:

<%@ Page language="c#" AutoEventWireup="false" %>
<%@ OutputCache Duration="600" VaryByParam="*"%>
<%@ Register TagPrefix="template" TagName="DefTemplate" Src="Templates/DefaultTemplate.ascx"%>
<template:DefTemplate runat="server"
RightModuleUrl="~/Templates/RightModule.ascx"
TopModuleUrl="~/Templates/DefaultMenu.ascx">
</template:DefTemplate>

И ... видим следующую неприятность:
если загрузить в один из PlaceHolder'ов контрол который подразумевает PostBack
(Например DataGrid with AllowSort="true") то на клиентской странице мы увидим
следующее:
<form name="_ctl0:_ctl0" method="post" action="App1.aspx" id="_ctl0__ctl0">
...
<script language="javascript">
<!--
function __doPostBack(eventTarget, eventArgument) {
var theform;
if (window.navigator.appName.toLowerCase().indexOf("netscape") > -1) {
theform = document.forms["_ctl0:_ctl0"];
}
else {
theform = document._ctl0:_ctl0;
}
theform.__EVENTTARGET.value = eventTarget.split("$").join(":");
theform.__EVENTARGUMENT.value = eventArgument;
theform.submit();
}
// -->
</script>
...
</form>

Естественно что во время выполнения строки theform = document._ctl0:_ctl0;
(обращение к форме идет по ее имени) происходит ошибка.

А имя такое из за того что UserControl является контейнером для HTMLForm


Если самому сгенерить клиентский скрипт где эта строка примет вид
theform = document._ctl0__ctl0; (обращение к форме идет по ее ID) то все
работает но в строке состояния IE висит сообщение об ошибке

Можно ли заставить ASP.NET не генирить клиентский скрипт с
function __doPostBack(eventTarget, eventArgument)?
Re: User control with server tag FORM and PostBack
От: mogadanez Чехия  
Дата: 25.12.03 14:13
Оценка:
Здравствуйте, SunComp, Вы писали:

известная проблема, нужне не заставлять его не генерить скрипт, а заставить изменить. например при помощи ResponseFilter

вот тут есть фикс здесь
правда он не отрабатывает при Server.Transfer, это тоже бага, читать: Re[3]: Response.Filter и Server.Rransfer
Автор: Demoniada
Дата: 15.12.03


и...используйте поиск.
... << RSDN@Home 1.1 beta 2 >>
Re[2]: User control with server tag FORM and PostBack
От: SunComp  
Дата: 25.12.03 14:26
Оценка:
Здравствуйте, mogadanez, Вы писали:

M>известная проблема, нужне не заставлять его не генерить скрипт, а заставить изменить. например при помощи ResponseFilter


M>вот тут есть фикс здесь

...

Большое спасибо!
Фикс скачал пошел смотреть....
Re[2]: User control with server tag FORM and PostBack
От: El Mariachi Россия CyberView
Дата: 01.02.04 08:14
Оценка:
Здравствуйте, mogadanez, Вы писали:

M>Здравствуйте, SunComp, Вы писали:


M>известная проблема, нужне не заставлять его не генерить скрипт, а заставить изменить. например при помощи ResponseFilter


M>вот тут есть фикс здесь


А нельзя ли разджевать, как его использовать. А то я совсем нгедавно из танка вылез
Re[2]: User control with server tag FORM and PostBack
От: lapa_ua Украина lapa.kharkov.ua
Дата: 12.04.04 10:22
Оценка:
Здравствуйте, mogadanez, Вы писали:

M>Здравствуйте, SunComp, Вы писали:


M>известная проблема, нужне не заставлять его не генерить скрипт, а заставить изменить. например при помощи ResponseFilter


M>вот тут есть фикс здесь

M>правда он не отрабатывает при Server.Transfer, это тоже бага, читать: Re[3]: Response.Filter и Server.Rransfer
Автор: Demoniada
Дата: 15.12.03


M>и...используйте поиск.


А как заставить этот фикс работать?
Выполняю инструкцию в которой сказано списать бинарник bin сайта и внести апдейт в Web.config.
Результата нет. Форма в названии имеет двоеточие, вызов в скрипте тоже содержит двоеточие. Ничего не изменилось.
Что я делаю не так ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.