Этот вопрос заставил меня задуматься о том, как можно решить проблему относительно невыполнимой задачи: плавную интеграцию сгенерированного сервером HTML-кода из ASP.NET с управлением на стороне клиента с помощью javascript.Конечно, вы всегда можете использовать javascript / jquery / library для создания одинакового отображения на стороне клиента.Но в большинстве случаев проще выполнять весь рендеринг на сервере, а не просто передавать данные клиентскому элементу управления, который должен обрабатывать пользовательский интерфейс и рендеринг.Или, может быть, у вас уже есть много менее интерактивного серверного кода, который вы на самом деле не хотите полностью повторять, используя библиотеки javascript, чтобы просто добавить лучшую интерактивность.
У меня была теория, которая, кажется, работаетв основном доказательство концепции.Предположим, вы хотите полностью перерисовать HTML-код сгенерированного сервером элемента управления на основе события на стороне клиента, без повторной отправки.Итак, используя jquery, у меня есть страница:
default.aspx:
<a id="link1" href="#">Click Here</a>
<div id="container">
<asp:PlaceHolder id="MyPlaceholder" runat="server" />
</div>
<script type="text/javascript">
$(document).ready(function() {
$('#link1').click(function() {
$.ajax({
url: "default.aspx",
type: "GET",
dataType: "html",
async: true,
data: { "ajax": "1" },
success: function(obj) {
// replace the HTML
$('#container').html(obj);
}
});
});
});
Событие заставляет его запрашивать себя с помощью ajax.Код, который выполняет хитрость, выглядит следующим образом:
TestUserControl ctl;
string ajax;
protected void Page_Load(object sender, EventArgs e)
{
ctl = (TestUserControl)Page.LoadControl("TestUserControl.ascx");
Myplaceholder.Controls.Add(ctl);
ctl.OnRender += new TestuserControl.RenderHandler(ctl_Render);
}
protected void Page_PreRender()
{
ajax = Request.QueryString["ajax"] == null ? "" : Request.QueryString["ajax"];
}
void ctl_Render()
{
if (ajax == "1")
{
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
using (HtmlTextWriter writer = new HtmlTextWriter(sw))
{
ctl.DoRender(writer);
}
Response.Write(sb.ToString());
Response.End();
}
}
В TestUserControl я раскрываю base.render для получения вывода:
public void DoRender(HtmlTextWriter writer)
{
base.Render(writer);
}
В основном, если страница вызывается безСтрока запроса "ajax", она действует как сама.Но когда эта строка запроса используется, она перехватывает выходной поток из содержимого, которое меня интересует (usercontrol с именем TestUserControl.ascx), и отображает только этот .Это возвращается клиенту, который обновляет HTML.Все идентификаторы будут воссозданы точно так же, как и раньше, поскольку я не пытаюсь отображать только этот элемент управления изолированно, а в контексте его собственной страницы.Теоретически каждый бит магии, созданный ASP.NET, должен воспроизводиться, извлекаться и обновляться с помощью ajax-запроса.
Помимо очевидной неэффективности, кажется, что в этом небольшом тесте он работает слаженно.Я могу полностью перерисовать элемент управления, используя сгенерированный сервером HTML без обратной передачи, и я написал ноль JavaScript.Этот пример на самом деле ничего не меняет, но было бы просто передать больше параметров для изменения вывода.
Мне было интересно, пробовал ли кто-нибудь подобное на практике?О каких потенциальных проблемах я мог не думать?
Если производительность сервера не является проблемой, может показаться, что это может быть довольно простым способом получить множество функциональных возможностей со всеми преимуществами серверных элементов управления ASP.NET.Но мне кажется, что я не могу найти никаких обсуждений об использовании этой техники на практике, поэтому мне интересно, чего мне не хватает.