C# 当下拉列表选择更改时,将丢失FileUpload文本框的值
我有一个dropdownlistbox和fileupload控件。从upload控件中选择一个文件后,如果我更改dropdownlist值(发生回发),那么我先前选择的文件路径将显示为空。 这是我的密码:C# 当下拉列表选择更改时,将丢失FileUpload文本框的值,c#,asp.net,C#,Asp.net,我有一个dropdownlistbox和fileupload控件。从upload控件中选择一个文件后,如果我更改dropdownlist值(发生回发),那么我先前选择的文件路径将显示为空。 这是我的密码: <asp:Label ID="lblupload" runat="server" Text="Upload a file: "></asp:Label> <asp:FileUpload ID="upload" runat="s
<asp:Label ID="lblupload" runat="server" Text="Upload a file: "></asp:Label>
<asp:FileUpload ID="upload" runat="server" Width="320" Height="18" BorderColor="Gray" BorderWidth="1" />
<asp:Label ID="Perimission" runat="server" Text="Perimission"></asp:Label>
<asp:DropDownList ID="ddlState" runat="server" OnSelectedIndexChanged="ddlState_SelectedIndexChanged" AutoPostBack="true" >
<asp:ListItem Text="Everybody" Value="Everybody"></asp:ListItem>
<asp:ListItem Text="Students" Value="Students"></asp:ListItem>
<asp:ListItem Text="Selected Users" Value="Selected Users"></asp:ListItem>
</asp:DropDownList>
不知道您是否真的需要dropdownlist上的autopostback。但是清除它,你就没事了。回发期间不会保存文件上载值 FileUpload控件在下一次回发时发布所选文件。因为更改下拉列表会启动回发,所以在更改下拉列表中的另一项时会上载文件
您可以通过将以下代码放入页面加载来测试这一点:
protected void Page_Load(object sender, EventArgs e)
{
if (upload.PostedFile != null)
{
Response.Write("<p>" + upload.PostedFile.FileName + "</p>");
}
}
受保护的无效页面加载(对象发送方,事件参数e)
{
如果(upload.PostedFile!=null)
{
响应。写入(“”+upload.PostedFile.FileName+””;
}
}
以下是您可以使用的快速解决方法:
将ScriptManager添加到页面
将dropdownlists放在AJAX中,并在UpdatePanel中显示按钮和列表框
这将使dropdownlists导致部分异步回发,而不是整页回发,因此FileUpload控件将能够保留其值
我知道这不是最有效的方法,但这是一种简单的方法,而且对用户来说也会更美观,因为页面不会仅仅因为在下拉列表中选择值而重新加载
但是,请记住将文件上载控件保留在UpdatePanel之外,否则文件上载将无法工作。如果选择了dropdownlistbox的值,则我将显示在页面加载时未显示的2个按钮控件和2个列表框控件,这可能是客户端希望执行的操作;已经构建了按钮和列表框控件(使用runat=“server”)并使用JavaScription显示它们这是一个安全问题。文本框通过添加value=“…”属性来保持其状态,但文件上载不应允许这样做,因为可以指定用户计算机上的文件。然后,您将能够添加一千个文件上载,随机猜测到常见cookie容器的路径,并执行自动回发以获取它们。不是你想要的东西。