我有以下代码。我想在文件大的时候显示一条消息。我的问题是只有当我按两次提交按钮时才会显示该消息。它总是落后一步。我该如何解决这个问题?
我正在做的是在文件很大时保存一个视图状态,当页面加载时,将标签的可见性设置为true或false,具体取决于文件大小。
我猜测负载发生在我的检查之前,那么我可以使用另一种方法代替Page_Load
,还是可以做其他方法让它起作用?
<asp:UpdatePanel ID="updatePanel" runat="server">
<ContentTemplate>
<div>
<div class="balClear">
<asp:FileUpload ID="uploader" CssClass="balUploader" runat="server"/>
<asp:ImageButton ID="uploaderEraser" CssClass="balUploaderCleaner" OnClick="uploaderEraser_Click" runat="server" Width="25" Height="25" />
</div>
<div style="clear:both">
<asp:Label ID="fileSizeError" runat="server" ForeColor="Red">The file you are trying to upload is too big. The maximul file size is 2MB.</asp:Label>
</div>
</div>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="uploaderEraser" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
<asp:Button ID="submit" runat="server" Text="Submit" OnClick="submit_Click" />
cs code:
string groupURL = "~/Uploads/Group/";
string privateURL = "~/Uploads/Private/";
int maximumMB = 2;
string folderURL
{
get { return IsGroup == true ? groupURL : privateURL; }
}
public bool IsGroup
{
get { return ViewState["balUploader_IsGroup"] == null ? false : (bool)ViewState["balUploader_IsGroup"]; }
set { ViewState["balUploader_IsGroup"] = value; }
}
bool FileTooBig
{
get { return ViewState["balUploader_FileTooBig"] == null ? false : (bool)ViewState["balUploader_FileTooBig"]; }
set { ViewState["balUploader_FileTooBig"] = value; }
}
protected void Page_Load(object sender, EventArgs e)
{
if (FileTooBig == true)
{
fileSizeError.Visible = true;
}
else
{
fileSizeError.Visible = false;
}
}
public void StoreFile()
{
if (uploader.HasFile)
{
if (uploader.FileBytes.Length / 1024 / 1024 < maximumMB)
{
FileTooBig = false;
string fileName = Path.GetFileName(uploader.FileName);
uploader.SaveAs(Server.MapPath(folderURL) + fileName);
}
else
{
FileTooBig = true;
}
}
else
{
FileTooBig = false;
}
}
protected void submit_Click(object sender, EventArgs e)
{
StoreFile();
}
答案 0 :(得分:1)
基本上,正在发生的事情是在submit_Click
之后发生了Page_Load
事件。这是由于ASP.NET页面生命周期。
事件的基本顺序如下:
1 - Init
2 - Load (Page_Load is fired)
3 - Control Events (submit_Click is fired)
4 - Load Complete
5 - Pre_Render
6 - Render
这里有两个选择。
1 - 使用LoadComplete处理程序:
protected override void OnLoadComplete(EventArgs e)
{
base.OnLoadComplete(e);
//Label Logic here
}
2 - 使用OnPreRender:
protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); //Label Logic here }