içinde çalışmaz Ağ üzerinden okudum, ancak aşağıdaki soruna bir çözüm bulamadım. ScriptManager
, UpdatePanel
, MultiView
iki Views
ve iki LinkButtons
görüntü arasında iki geçiş ile bu örnek sayfa (_ScriptManager.aspx) var. İkinci görünümde (_ScriptManager.js) için bir JavaScript dosyası yüklemek istediğim bazı işlevler var.ScriptManager.RegisterClientScriptInclude, UpdatePanel
Kullanıcının 2 kez ziyaret edip etmeyeceğini bilmediğimden, her istek için javascript dosyasını statik olarak eklemek istemiyorum. İhtiyacım olduğunda sadece yüklemek istiyorum. Bu nedenle, script dosyasını ScriptManager.RegisterClientScriptInclude
için kullandığım asenkronize bir geri gönderme sırasında eklemem gerekiyor. Acı: işe yaramıyor. Komut dosyası, istemcide bir şekilde yürütülmemiştir, böylece içerideki javascript işlevleri kullanılamaz. Daha da kötüsü, ben ScriptManager.RegisterStartupScript
kayıt defterine blok bu durumda idam edilmez! Hepsi çok rahatsız edici. İlginç olan, içerme komut dosyasının ve komut dosyası bloğunun istemciye gönderilmesini (asılsız gönderim) (Fiddler benim arkadaşım :-)) ve betik dosyasının da yüklenmesidir. Ama sonra javascript bir şekilde kırılıyor gibi görünüyor ...
Herhangi bir kimse bir ipucu veya bildirilen bir hatayı biliyor mu?
_ScriptManager.aspx:
function dynamic() {
alert('dynamic');
$('#divDyn').text('Dynamic!');
}
_ScriptManager.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="_ScriptManager.aspx.cs" Inherits="Frontend.Web._Tests.ScriptManagerTest" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
<script src="http://ajax.microsoft.com/ajax/jQuery/jquery-1.3.2.min.js"></script>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager runat="server" ID="scm"></asp:ScriptManager>
<asp:Label runat="server" ID="lbOut">Outside of UpdatePanel</asp:Label>
<div style="border: solid 1px red;">
<asp:UpdatePanel runat="server" ID="up" UpdateMode="Conditional">
<ContentTemplate>
<div>
<asp:LinkButton runat="server" ID="btnFirst">Show view 1</asp:LinkButton>
<asp:LinkButton runat="server" ID="btnSecond">Show view 2</asp:LinkButton>
</div>
<div>
<asp:MultiView runat="server" ID="mv">
<asp:View runat="server" ID="vw1">First view - static content</asp:View>
<asp:View runat="server" ID="vw2">
Second view - dynamically loaded content (between dashes):
<div>#<span id="divDyn"></span>#</div>
</asp:View>
</asp:MultiView>
</div>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</body>
</html>
_ScriptManager.js (burada ben sadece id = divDyn ile span bazı dinamik içerik eklemek) .cs kod arkasında:
public partial class ScriptManagerTest : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
btnFirst.Click += delegate { mv.SetActiveView(vw1); };
btnSecond.Click += delegate { mv.SetActiveView(vw2); };
if (!IsPostBack)
{
// Test 1: does not work
mv.SetActiveView(vw1);
// Test 2: works, because required script is loaded on initial page request
//mv.SetActiveView(vw2);
}
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
if (mv.GetActiveView() == vw2)
{
// Not calling the RegisterClientScriptInclude
// makes the alert work in both cases, but this is
// what it's all about: including script only when
// needed!
ScriptManager.RegisterClientScriptInclude(
Page, Page.GetType(), "include-js",
ResolveClientUrl("~/ScriptManager.js"));
ScriptManager.RegisterStartupScript(
this, GetType(), "call-dynamic",
"alert('hi there'); dynamic();", true);
}
}
}