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)?