我迫切需要调试帮助,现在已经陷入这个错误6天了.....
我在ASp.net应用中遇到的错误是:
Microsoft JScript runtime error: Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed. Common causes for this error are when the response is modified by calls to Response.Write(), response filters, HttpModules, or server trace is enabled.
Details: Error parsing near '<script type='text/j'.
以下是相关的代码段
CollyDataExchangeWebService Col_ValSub = new CollyDataExchangeWebService();
CollyReportServiceRequest ServiceReq = new CollyReportServiceRequest();
CollyReportServiceRequestData ServiceReqData = new CollyReportServiceRequestData();
ServiceReqData.AmendmentIndicatorSpecified = true;
ServiceReqData.AmendmentIndicator = false;
ServiceReqData.CollyReport = ColRep;
ServiceReq.ServiceRequestData = ServiceReqData;
ServiceReq.ServiceRequestHeader = ServiceHeader;
errValidate = null;
//btnOK.OnClientClick = "MSGShow()";
bool Valid = true;
string ErrMsgs = "";
if (((System.Web.UI.WebControls.Button)(sender)).CommandArgument == "Validate")
{
CollyReportServiceResponse ValResponse = Col_ValSub.validateReport(ServiceReq);
switch (ValResponse.ServiceResponseHeader.ServiceStatus)
{
case ServiceStatus.Successful:
btnOK.OnClientClick = "";
valHeader.Text = "Validation is Completed. No errors were found";
mlValPopup.Show();
break;
case ServiceStatus.ValidationErrors:
Valid = false;
ErrMsgs = ErrMsgs + _ValidationError(ValResponse);
ValBTN.Update();
mlValPopup.Show();
break;
case ServiceStatus.SystemError:
btnOK.OnClientClick = "";
Valid = false;
ErrMsgs = ErrMsgs + _SystemError(ValResponse);
ValBTN.Update();
mlValPopup.Show();
break;
}
经过数小时的调试后,我发现这一行导致错误:
CollyReportServiceResponse ValResponse = Col_ValSub.validateReport(ServiceReq);
经过6天的调试和挫折后,我发现有些记录导致了这个问题而其他人没有使用OLDER版本的代码,但是在新版本中,所有记录都会导致此错误,因此它必须对数据进行处理。 DB这意味着代码中的某些方法与null的行为不同,但我无法确切地知道问题是什么,因为我的应用程序是30k行代码
在搜索并尝试各种解决方案后,下面的2不是我的问题的解决方案。forums.asp.net/t/1357862.aspx http://www.vbforums.com/showthread.php?t=656246
我想提一下,我已经很难处理这个应用程序,因为它是由其他程序员编写的,这些程序员现在已经很久没有留下未记录或注释的意大利面条代码。
我没有对此进行编码,但过去的其他程序员已将Response.Write放在代码中:
private void MessageBox(string msg)
{
if (!string.IsNullOrEmpty(msg))
{
Global.tmpmsg = msg;
msg = null;
}
Response.Write("<script type=\"text/javascript\" language=\"javascript\">");
Response.Write("window.open('ErrorPage.aspx?msg=" + "','PopUp','screenX=0,screenY=0,width=700,height=340,resizable=1,status=no,scrollbars=yes,toolbars=no');");
Response.Write("</script>");
}
这是另一种方法:
Response.Write("<script type=\"text/javascript\" language=\"javascript\">");
Response.Write("alert('No search resuls were found');");
Response.Write("</script>");
或者这个:
if (!string.IsNullOrEmpty(msg))
{
Global.tmpmsg = msg;
Response.Write("<script type=\"text/javascript\" language=\"javascript\">");
Response.Write("window.open('ErrorPage.aspx?msg=" + "','PopUp','screenX=0,screenY=0,width=700,height=340,resizable=1,status=no,scrollbars=yes,toolbars=no');");
Response.Write("</script>");
}
在Jrummel发表评论后,我将其添加到代码中,然后什么也没发生。
private void MessageBox(string msg)
{/*
if (!string.IsNullOrEmpty(msg))
{
Global.tmpmsg = msg;
msg = null;
}
Response.Write("<script type=\"text/javascript\" language=\"javascript\">");
Response.Write("window.open('ErrorPage.aspx?msg=" + "','PopUp','screenX=0,screenY=0,width=700,height=340,resizable=1,status=no,scrollbars=yes,toolbars=no');");
Response.Write("</script>");
*/
// Define the name and type of the client scripts on the page.
String csname1 = "PopupScript";
Type cstype = this.GetType();
// Get a ClientScriptManager reference from the Page class.
ClientScriptManager cs = Page.ClientScript;
// Check to see if the startup script is already registered.
if (!cs.IsStartupScriptRegistered(cstype, csname1))
{
String cstext1 = "<script type=\"text/javascript\" language=\"javascript\">" + " " + "window.open('ErrorPage.aspx?msg=" + "','PopUp','screenX=0,screenY=0,width=700,height=340,resizable=1,status=no,scrollbars=yes,toolbars=no');" + " " + "</script>";
cs.RegisterStartupScript(cstype, csname1, cstext1, false);
}
}
答案 0 :(得分:2)
经过2周的调试和2天的暴力破解后,我发现了错误:
在我所拥有的800个DB列之一中,有一个null /不正确的值。此值与我的ASP.NET代码中的150个方法之一作出反应,即使Response.Write()不是问题,也会出现JavaScript错误。我还没有找到对这个值做出反应的方法,但我找到的解决办法就是在列记录上输入一个有效的值。
程序员如何蛮力发现问题:
在经过长时间的调试后,我采取了一个工作记录的样本和另一个错误领先记录的样本。一旦我实现了这一点,我就用了
DELETE FROM tablename WHERE UniqueColID= unique identifier for the error causing record
然后我做了:
INSERT INTO tablename ([uniqueIdentifier],[ column 2],[column 3]) SELECT @UniqueIdentifierofErrorCausingRecord, column2, [column3] FROM TableName WHERE [uniqueIdentifier]=@UniqueIdentifierForWorkingRecord;
第一个语句的作用是删除非工作记录,然后第二个语句重新插入具有相同工作记录列值但具有非工作记录的UniqueIdentifier的记录。这样我就可以通过每个表来查找导致错误的表,然后我可以确定该表的哪一列是问题。
我的案例中的具体问题是DateTime.TryParse(),因为以不正确的格式插入了表列值。代码在其中一个方法中执行字段填充而没有使用DateTime.Parse方法尝试捕获。 ..经过一些测试后,似乎即使是try / catch也无法选择此错误,因为它是一个javascript错误..
答案 1 :(得分:1)
请勿使用Response.Write()
。
而是创建一个 LiteralControl
并将其添加到页面。
使用ClientScriptManager
向页面添加脚本。以下是MSDN的一个例子:
// Define the name and type of the client scripts on the page.
String csname1 = "PopupScript";
Type cstype = this.GetType();
// Get a ClientScriptManager reference from the Page class.
ClientScriptManager cs = Page.ClientScript;
// Check to see if the startup script is already registered.
if (!cs.IsStartupScriptRegistered(cstype, csname1))
{
String cstext1 = "alert('Hello World');";
cs.RegisterStartupScript(cstype, csname1, cstext1, true);
}