PDA

View Full Version : چرا مثال ClientScriptManager.GetCallbackEventReference در FF کار نمیکند؟



eshpilen
جمعه 22 بهمن 1389, 23:55 عصر
در این صفحه که یک مثال در MSDN هست:

<%@ Page Language="C#" %>
<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

public int cbCount = 0;

// Define method that processes the callbacks on server.
public void RaiseCallbackEvent(String eventArgument)
{
cbCount = Convert.ToInt32(eventArgument) + 1;
}

// Define method that returns callback result.
public string GetCallbackResult()
{
return cbCount.ToString();
}

protected void Page_Load(object sender, EventArgs e)
{
// Define a StringBuilder to hold messages to output.
StringBuilder sb = new StringBuilder();

// Check if this is a postback.
sb.Append("No page postbacks have occurred.");
if (Page.IsPostBack)
{
sb.Append("A page postback has occurred.");
}

// Write out any messages.
MyLabel.Text = sb.ToString();

// Get a ClientScriptManager reference from the Page class.
ClientScriptManager cs = Page.ClientScript;

// Define one of the callback script's context.
// The callback script will be defined in a script block on the page.
StringBuilder context1 = new StringBuilder();
context1.Append("function ReceiveServerData1(arg, context)");
context1.Append("{");
context1.Append("Message1.innerText = arg;");
context1.Append("value1 = arg;");
context1.Append("}");

// Define callback references.
String cbReference1 = cs.GetCallbackEventReference(this, "arg",
"ReceiveServerData1", context1.ToString());
String cbReference2 = cs.GetCallbackEventReference("'" +
Page.UniqueID + "'", "arg", "ReceiveServerData2", "",
"ProcessCallBackError", false);
String callbackScript1 = "function CallTheServer1(arg, context) {" +
cbReference1 + "; }";
String callbackScript2 = "function CallTheServer2(arg, context) {" +
cbReference2 + "; }";

// Register script blocks will perform call to the server.
cs.RegisterClientScriptBlock(this.GetType(), "CallTheServer1",
callbackScript1, true);
cs.RegisterClientScriptBlock(this.GetType(), "CallTheServer2",
callbackScript2, true);

}
</script>

<script type="text/javascript">
var value1 = 0;
var value2 = 0;
function ReceiveServerData2(arg, context) {
Message2.innerText = arg;
value2 = arg;
}
function ProcessCallBackError(arg, context) {
Message2.innerText = 'An error has occurred.';
}
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>ClientScriptManager Example</title>
</head>
<body>
<form id="Form1"
runat="server">
<div>
Callback 1 result: <span id="Message1">0</span>
<br />
Callback 2 result: <span id="Message2">0</span>
<br /> <br />
<input type="button"
value="ClientCallBack1"
onclick="CallTheServer1(value1, alert('Increment value'))"/>
<input type="button"
value="ClientCallBack2"
onclick="CallTheServer2(value2, alert('Increment value'))"/>
<br /> <br />
<asp:Label id="MyLabel"
runat="server"></asp:Label>
</div>
</form>
</body>
</html>

دکمه های مربوطه رو که کلیک میکنیم، باید عدد نوشته شده جلوی Callback 1 result و Callback 2 result افزایش پیدا بکنه.
در IE8 درست کار میکنه اما در FF3.6.8 درست کار نمیکنه (مقدارها افزایش داده نمیشن).
علتش چیه و چطوری میشه رفعش کرد؟
پیامهای خطای جاواسکریپتی که FF میده مثلا اینهاست:

Error: Message2 is not defined
Source File: http://localhost:1292/WebSite14/Default.aspx
Line: 11
Error: ReceiveServerData1 is not defined
Source File: http://localhost:1292/WebSite14/Default.aspx
Line: 53


حتی اگر جوابی ندارید لطفا شما هم تست کنید ببینید با فایرفاکس مشکل دارید یا نه (نسخهء مرورگر رو هم درج کنید).

mehdi.mousavi
شنبه 23 بهمن 1389, 12:41 عصر
سلام.
خطای ReceiveServerData1 is not defined رو میگیرید، چون تابع مزبور تعریف نشده. کد زیر رو به انتهای Page_Load اضافه کنید تا این مشکل رفع بشه:


cs.RegisterClientScriptBlock(this.GetType(), "Whatever", context1.ToString(), true);خطای بعدی نیز بدلیل استفاده از innerText رخ میده. جای innerText از innerHTML استفاده کنید تا مشکل در کلیه Browser ها رفع بشه...

در نهایت، خطای دیگه به دلیل نوع آدرس دهی Message1 و Message2 رخ میده (که ظاهرا Firefox باهاش مشکلی نداره، اما خوب، روش صحیحی نیست). جای اون، باید از متودهای W3C DOM استفاده بشه. در واقع جای Message1 باید نوشته بشه:


document.getElementById('Message1')موفق باشید.