文件上载控件HasFile始终为false,name始终为空字符串,不使用更新面板

时间:2011-11-18 14:22:28

标签: asp.net file-upload

我有一个详细信息视图,其中包含文件上载字段。当我填写信息并上传文件(我已经尝试了9k到6.8MB的多个文件)时,所有信息(文本字段)都提交正常,但是当我检查HasFile时,上传的文件总是返回false检查文件名时返回String.Empty。

我做错了吗?详细信息视图位于Panel中,非更新面板

    <asp:Panel ID="pnlUpdate" runat="server"
        Visible="false">
        <h4 runat="server" id="h2SubCaption">Person Details</h4>
        <asp:DetailsView ID="dvAssignment" 
            runat="server" 
            AutoGenerateRows="false" 
            Width="100%"
            SkinID="SampleDetailsView" 
            CssSelectorClass="PrettyDetailsView"
            DataKeyNames="guidMemberId"
            DefaultMode="Edit"
            OnItemUpdating="dvAssignment_ItemUpdating" 
            OnModeChanging="dvAssignment_ModeChanging"
            AutoGenerateEditButton="True" >  
<Fields>   
<asp:TemplateField HeaderText="Nomination Letter">
                        <EditItemTemplate>
                            <asp:FileUpload runat="server" ID="fileuploadNomination" />
                        </EditItemTemplate>
                    </asp:TemplateField> .....

代码背后:

        FileUpload _nomination = (FileUpload)dv.FindControl("fileuploadNomination");
    byte[] nominationByte = null;
    if (_nomination.FileName != string.Empty)
        nominationByte = _nomination.FileBytes;
    //if(_nomination.HasFile)
    //nominationByte = _nomination.FileBytes;

修改 我添加了一个Page_Load调用,当我单击DetailsView的自动生成的更新按钮时,它看起来好像页面正在回发。这个回发可能正在清除我的FileUpload字段。关于如何绕过它的任何想法?

编辑#2 我现在在DetailsView周围放置了一个更新面板并设置回​​发触发DetailsView(见下文)并且它仍然无法正常工作,它似乎是先清除上传控件提交。

<asp:UpdatePanel ID="updatePnl" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <asp:Panel ID="pnlUpdate" runat="server"
            Visible="false">
            <h4 runat="server" id="h2SubCaption">Person Details</h4>
            <asp:DetailsView ID="dvAssignment" 
                runat="server" 
                AutoGenerateRows="false" 
                Width="100%"
                SkinID="SampleDetailsView" 
                CssSelectorClass="PrettyDetailsView"
                DataKeyNames="guidMemberId"
                DefaultMode="Edit"
                OnItemUpdating="dvAssignment_ItemUpdating" 
                OnModeChanging="dvAssignment_ModeChanging"
                AutoGenerateEditButton="True" >
                <FieldHeaderStyle Font-Bold="True" Width="150px" />
                <Fields>

                            

                            <asp:FileUpload runat="server" ID="fileuploadNomination" />
                        </EditItemTemplate>
                    </asp:TemplateField>
 </Fields>
                </asp:DetailsView >       
            </asp:Panel>
         </ContentTemplate>
        <Triggers>
            <asp:PostBackTrigger ControlID="dvAssignment" /> 
        </Triggers>
    </asp:UpdatePanel>

按要求提供Gridview代码

 <asp:GridView ID="gvQuality" 
        runat="server" 
        AutoGenerateColumns="False"
        Width="100%"
        DataKeyNames="guidMemberId"
        CssSelectorClass="PrettyGridView"
        SkinID="SampleGridView"
        OnSelectedIndexChanged="gvQuality_SelectedIndexChanged" 
        onrowdatabound="gvQuality_RowDataBound">
        <Columns>
            <asp:TemplateField>
                <ItemTemplate>
                   <asp:LinkButton ID="btnViewDetails" runat="server" Text="Edit" CommandName="Select" />
                                    </ItemTemplate>
            </asp:TemplateField>

一些绑定字段在此之后(名字,姓氏等)

protected void gvQuality_SelectedIndexChanged(object sender, EventArgs e)
{
    Guid guidMemberId = (Guid)gvQuality.SelectedDataKey.Values["guidMemberId"];
    PortalDataContext db = new PortalDataContext(AuthenticatedUser.ConnectionString);
    h2SubCaption.InnerText = "Update Person";
    dvAssignment.ChangeMode(DetailsViewMode.Edit);

    dvAssignment.DataSource = LINQ Query Here
    dvAssignment.DataBind();
}

4 个答案:

答案 0 :(得分:10)

每个人,感谢所有的帮助,但我明白了。我必须设置Page.Form.Enctype = "multipart/form-data

以下是它的工作代码!

protected void Page_Load(object sender, EventArgs e)
{
    this.Page.Form.Enctype = "multipart/form-data";
}

答案 1 :(得分:0)

如果这是一个愚蠢的答案,我很抱歉,但我通常在gridviews上使用selectedindexchanging来捕获当前行值。您是否尝试过而不是selectedindexchanged?

答案 2 :(得分:0)

你可以试试 Request.Files [0]获取上传文件

答案 3 :(得分:0)

确保同一页上只有一个<form>

相关问题