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)?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.