使用C#在asp.net中Viewstate中没有获取到值?

4

我正在使用asyncfileupload控件上传文件,我在视图状态中获取路径的方法如下:

protected void ProcessUpload(object sender, AjaxControlToolkit.AsyncFileUploadEventArgs e)
{
    string name = System.IO.Path.GetFileName(e.FileName); 
    string dir = Server.MapPath("upload_eng/");
    string path = Path.Combine(dir, name);
    ViewState["path"] = path;
    engcertfupld.SaveAs(path);
}

现在,当我尝试在按钮单击事件中保存该路径时,我无法获取视图状态的值:

protected void btnUpdate_Click(object sender, EventArgs e)
{
   string filepath = ViewState["path"].ToString(); // GETTING NULL in filepath
}

在这个文件路径中,我得到了null,实际上我得到了一个错误 NULL REFERENCE EXCEPTION

现在我该怎么办?

2个回答

4

将路径值放入Session对象中,而不是ViewState中,如下所示:

protected void ProcessUpload(object sender, AjaxControlToolkit.AsyncFileUploadEventArgs e)
{

    ....
    string path = Path.Combine(dir, name);
    Session["path"] = path;
}

在按钮点击事件中:
protected void btnUpdate_Click(object sender, EventArgs e)
{
  if (Session["path"] != null)
  {
     string filepath = (string) Session["path"];
  }
}

是的,我已经完成了这个任务并且得到了结果,但我仍然想知道为什么ViewState没有起作用? - Arindam Das
在方法的上下文中使用静态变量就足够了 :) - Julián

1

我猜上传过程不是一个“真正”的回传,所以ViewState不会在客户端刷新,也不会在btnUpdate_Click点击时包含路径。

你应该使用OnClientUploadComplete客户端事件来检索上传的文件名,并将其存储在HiddenField中,在btnUpdate_Click上将其发布到服务器。

这里有一个完整的例子,其中上传的文件名用于显示上传的图像而无需回传:

http://www.aspsnippets.com/Articles/Display-image-after-upload-without-page-refresh-or-postback-using-ASP.Net-AsyncFileUpload-Control.aspx


但是在ProcessUpload中,我最初在viewstate中得到了一个值,无论是否回发,viewstate都应该有这个值。 - Arindam Das
1
@ArindamDas:您在ProcessUpload中设置的值不会被发送回客户端以便发布到服务器(因为这不是真正的回发)。服务器不会在回发之间存储ViewState。是客户端在一个(有时很大的)隐藏字段中存储ViewState并将其发布回服务器。如果回发往返过程没有发生,服务器就无法将ViewState传输给客户端。这就是为什么我建议使用客户端事件处理的原因。 - jbl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接