为什么我在后端C#上创建的对象变为空
我使用asp.net和c#作为后端代码,在前端使用html、javascript/jquery 用户单击网站上的“详细信息”以查看和编辑以前创建的请求 jquery/ajax在后端调用方法以获取有关请求的信息。 将创建一个对象newWaferRequest来保存此信息。对象从ajax调用返回,站点用该信息填充表单。然后,用户可以编辑表单、向请求添加新程序、修改现有请求信息等 我遇到的问题是,当用户选择“savePgm”时,ajax调用后端savePgm方法,该方法应该更新之前创建的对象newWaferRequest,但我收到一个nullReferenceException。异常指向newWaferRequest对象为null。这发生在用户更新请求的不同时间。有时,用户可以通过后端的正确响应更新程序并添加新程序。其他情况下会发生异常 在使用web时,我不能完全掌握变量是如何“存储”的。我在这里读了多篇文章,并且读过关于会话和视图状态变量的文章。我尝试在一个会话中保存该对象,但没有成功 这只是我的c代码的开始,我最初尝试使用静态变量。所有对象都在App_代码cs文件中为什么我在后端C#上创建的对象变为空,c#,asp.net,ajax,C#,Asp.net,Ajax,我使用asp.net和c#作为后端代码,在前端使用html、javascript/jquery 用户单击网站上的“详细信息”以查看和编辑以前创建的请求 jquery/ajax在后端调用方法以获取有关请求的信息。 将创建一个对象newWaferRequest来保存此信息。对象从ajax调用返回,站点用该信息填充表单。然后,用户可以编辑表单、向请求添加新程序、修改现有请求信息等 我遇到的问题是,当用户选择“savePgm”时,ajax调用后端savePgm方法,该方法应该更新之前创建的对象newWa
public partial class Nbump_Request : System.Web.UI.Page
{
//public static person currentPerson = new person();
//public static requestSearch searchRequest;
//public static waferRequest newWaferRequest;
//public static waferRequestObject newWaferRequestObject;
static person currentPerson = new person();
static requestSearch searchRequest;
static waferRequest newWaferRequest;
static waferRequestObject newWaferRequestObject;
下面是用于现有请求的ajax方法,它创建对象
[WebMethod]
public static string queryRequestExisting(string request_pk)
{
JavaScriptSerializer js = new JavaScriptSerializer();
try
{
newWaferRequest = new waferRequest(request_pk, "EXISTINGREQUEST");
newWaferRequestObject = newWaferRequest.CURRENTREQUEST;
string json = js.Serialize(newWaferRequest);
return json;
}
catch (Exception)
{
return null;
}
}
以下是用户保存或更新程序信息的ajax代码。我在代码中添加了检查并返回的对象为null
public static string savePgmData(Dictionary<string, string> pgm_requests)
{
PgmRequestObject currentPgm;
if (newWaferRequest != null)
{
try
{
//if (!Convert.ToBoolean(pgm_requests["pgmEdit"])) //not performed when request pgm being edited
string rtnMessage;
//create new pgm in waferRequest object
if (pgm_requests["PGMRT_INDEX_PK"] == null)
{
int index = newWaferRequest.addNewPGMRequest() - 1;
currentPgm = (PgmRequestObject)newWaferRequest.PGMREQUESTLIST[index];
string pgmPrimaryKey = currentPgm.PGMRT_INDEX_PK;
rtnMessage = "{\"message\": \"Added and saved new pgm successfully\", \"primaryKey\":\"" + pgmPrimaryKey + "\"}";
}
//get pgm to update at index provided
else if (pgm_requests["pgmRowIndex"] != "-1")
{
int index = Convert.ToInt32(pgm_requests["pgmRowIndex"]);
currentPgm = (PgmRequestObject)newWaferRequest.PGMREQUESTLIST[index];
rtnMessage = "Edited and saved pgm successfully";
}
//save initial pgm
else
{
currentPgm = (PgmRequestObject)newWaferRequest.PGMREQUESTLIST[0];
rtnMessage = "Initial pgm added successfully";
}
currentPgm.updatePGM(pgm_requests["pgmNameList"], pgm_requests["pgmNameText"]);
currentPgm.updateStatus(pgm_requests["pgmStatus"]);
currentPgm.updateWafers(pgm_requests["pgmWfrList"], pgm_requests["pgmWfrNum"]);
currentPgm.updatePriority(pgm_requests["pgmTestOrder"]);
currentPgm.updateFailBinRetest(pgm_requests["pgmFbr"], pgm_requests["pgmFbrBins"]);
//currentPgm.CommitIntoDatabase(); // -- Called on individual requests updates before request saved
return rtnMessage;
}
catch (Exception ex)
{
return "Failed to save program\n\n" + ex.Data + "\n" + ex.Message + "\n" + ex.StackTrace + "\n";
}
}
else
{
return "newWaferRequest object is null\n";
}
}
下面是一个我在会话中尝试的示例。我去掉了静态变量,修改了方法
[WebMethod(EnableSession=true)]
public static string queryRequestExisting(string request_pk)
{
waferRequest newWaferRequest;
waferRequestObject newWaferRequestObject;
JavaScriptSerializer js = new JavaScriptSerializer();
try
{
newWaferRequest = new waferRequest(request_pk, "EXISTINGREQUEST");
newWaferRequestObject = newWaferRequest.CURRENTREQUEST;
HttpContext.Current.Session["newWaferRequest"] = newWaferRequest;
HttpContext.Current.Session["newWaferRequestObject"] = newWaferRequestObject;
string json = js.Serialize(newWaferRequest);
return json;
}
catch (Exception)
{
return null;
}
}
//snippet of savePgmData with session
public static string savePgmData(Dictionary<string, string> pgm_requests)
{
waferRequest newWaferRequest = HttpContext.Current.Session["newWaferRequest"];
PgmRequestObject currentPgm;
if (newWaferRequest != null)
{
try
{
//if (!Convert.ToBoolean(pgm_requests["pgmEdit"])) //not performed when request pgm being edited
string rtnMessage;
//create new pgm in waferRequest object
if (pgm_requests["PGMRT_INDEX_PK"] == null)
{
int index = newWaferRequest.addNewPGMRequest() - 1;
currentPgm = (PgmRequestObject)newWaferRequest.PGMREQUESTLIST[index];
[WebMethod(EnableSession=true)]
公共静态字符串queryRequestExisting(字符串请求\u pk)
{
waferRequest newWaferRequest;
waferRequestObject新建waferRequestObject;
JavaScriptSerializer js=新的JavaScriptSerializer();
尝试
{
newWaferRequest=新的waferRequest(请求主键,“EXISTINGREQUEST”);
newWaferRequestObject=newWaferRequest.CURRENTREQUEST;
HttpContext.Current.Session[“newWaferRequest”]=newWaferRequest;
HttpContext.Current.Session[“newWaferRequestObject”]=newWaferRequestObject;
字符串json=js.Serialize(newWaferRequest);
返回json;
}
捕获(例外)
{
返回null;
}
}
//带有会话的savePgmData片段
公共静态字符串savePgmData(字典pgm_请求)
{
waferRequest newWaferRequest=HttpContext.Current.Session[“newWaferRequest”];
PgmRequestObject当前PGM;
if(newWaferRequest!=null)
{
尝试
{
//如果(!Convert.ToBoolean(pgm_请求[“pgmEdit”])//在编辑请求pgm时未执行
字符串RTN消息;
//在waferRequest对象中创建新的pgm
如果(pgm_请求[“PGMRT_索引_PK”]==null)
{
int index=newWaferRequest.addNewPGMRequest()-1;
currentPgm=(PgmRequestObject)newWaferRequest.PGMREQUESTLIST[索引];
由于工作安全原因,我只能显示代码。如果需要更多信息,请告诉我
此外,代码在我的本地服务器上似乎运行良好。问题是当我将其放在生产服务器或开发服务器上时,我无法对这两个服务器进行更改。您是否在应用程序池中使用用于生产服务器上网站的Web Garden?如果是的话,这可能是问题所在。我是个新手对于任何类型的web开发。我不确定生产服务器是如何设置的。我必须询问我的IT部门他们是如何设置的。我希望这只是我的代码中的某个内容…或者可能是我需要应用的web.config文件中的某个内容。几乎不可能理解您的问题是什么,仅仅发布一堆不完整的代码使问题更加模糊,例如,您有两个不同的queryRequestExisting方法定义。请告诉我们您从何处获得空引用异常。这是一个相当常见的错误,通常表示代码中存在一些问题,如数据库更新失败,可能是由于缺少参数等。您应该指出断点并查看错误发生的确切位置是的,我意识到很难理解问题是什么…相信我,我已经阅读了许多不同的论坛问题和答案。如果你注意到两个不同的queryExistingData方法…一个是我的原始代码,另一个是显示我如何尝试使用会话存储对象。当我尝试调用savePgmData时,就会出现问题,因为我有代码,如果(newWaferRequest!=null)--有时为null,有时不为null。
[WebMethod(EnableSession=true)]
public static string queryRequestExisting(string request_pk)
{
waferRequest newWaferRequest;
waferRequestObject newWaferRequestObject;
JavaScriptSerializer js = new JavaScriptSerializer();
try
{
newWaferRequest = new waferRequest(request_pk, "EXISTINGREQUEST");
newWaferRequestObject = newWaferRequest.CURRENTREQUEST;
HttpContext.Current.Session["newWaferRequest"] = newWaferRequest;
HttpContext.Current.Session["newWaferRequestObject"] = newWaferRequestObject;
string json = js.Serialize(newWaferRequest);
return json;
}
catch (Exception)
{
return null;
}
}
//snippet of savePgmData with session
public static string savePgmData(Dictionary<string, string> pgm_requests)
{
waferRequest newWaferRequest = HttpContext.Current.Session["newWaferRequest"];
PgmRequestObject currentPgm;
if (newWaferRequest != null)
{
try
{
//if (!Convert.ToBoolean(pgm_requests["pgmEdit"])) //not performed when request pgm being edited
string rtnMessage;
//create new pgm in waferRequest object
if (pgm_requests["PGMRT_INDEX_PK"] == null)
{
int index = newWaferRequest.addNewPGMRequest() - 1;
currentPgm = (PgmRequestObject)newWaferRequest.PGMREQUESTLIST[index];