C# 当下拉列表选择更改时,将丢失FileUpload文本框的值

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

我有一个dropdownlistbox和fileupload控件。从upload控件中选择一个文件后,如果我更改dropdownlist值(发生回发),那么我先前选择的文件路径将显示为空。 这是我的密码:

<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容器的路径,并执行自动回发以获取它们。不是你想要的东西。