Asp.net 文件上载控件HasFile始终为false,名称始终为空字符串,未使用更新面板

Asp.net 文件上载控件HasFile始终为false,名称始终为空字符串,未使用更新面板,asp.net,file-upload,Asp.net,File Upload,我有一个详细信息视图,其中有一个文件上载字段。当我填写信息并上传一个文件时(我尝试了从9k到6.8MB的多个文件),所有信息(文本字段)都可以提交,但是当我检查HasFile时上传的文件总是返回false,当我检查文件名时总是返回String.Empty <asp:FileUpload runat="server" ID="fileuploadNomination" /> <

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

                            <asp:FileUpload runat="server" ID="fileuploadNomination" />
                        </EditItemTemplate>
                    </asp:TemplateField>
 </Fields>
                </asp:DetailsView >       
            </asp:Panel>
         </ContentTemplate>
        <Triggers>
            <asp:PostBackTrigger ControlID="dvAssignment" /> 
        </Triggers>
    </asp:UpdatePanel>
我做错什么了吗?详细信息视图位于面板中,不是更新面板

    <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> .....
                            <asp:FileUpload runat="server" ID="fileuploadNomination" />
                        </EditItemTemplate>
                    </asp:TemplateField>
 </Fields>
                </asp:DetailsView >       
            </asp:Panel>
         </ContentTemplate>
        <Triggers>
            <asp:PostBackTrigger ControlID="dvAssignment" /> 
        </Triggers>
    </asp:UpdatePanel>
编辑 我添加了一个页面加载调用,当我单击DetailsView的“自动生成更新”按钮时,页面看起来好像是在发回。此回发可能正在清除我的文件上载字段。你有什么想法吗

                            <asp:FileUpload runat="server" ID="fileuploadNomination" />
                        </EditItemTemplate>
                    </asp:TemplateField>
 </Fields>
                </asp:DetailsView >       
            </asp:Panel>
         </ContentTemplate>
        <Triggers>
            <asp:PostBackTrigger ControlID="dvAssignment" /> 
        </Triggers>
    </asp:UpdatePanel>
编辑#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上使用SelectedIndexChanged来捕获当前行的值。您是否尝试过用它代替selectedindexchanged?

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

Request.Files[0]获取上传文件

各位,谢谢大家的帮助,但我找到了答案。我必须设置
Page.Form.Enctype=“multipart/Form data

                            <asp:FileUpload runat="server" ID="fileuploadNomination" />
                        </EditItemTemplate>
                    </asp:TemplateField>
 </Fields>
                </asp:DetailsView >       
            </asp:Panel>
         </ContentTemplate>
        <Triggers>
            <asp:PostBackTrigger ControlID="dvAssignment" /> 
        </Triggers>
    </asp:UpdatePanel>
这是它工作的代码

                            <asp:FileUpload runat="server" ID="fileuploadNomination" />
                        </EditItemTemplate>
                    </asp:TemplateField>
 </Fields>
                </asp:DetailsView >       
            </asp:Panel>
         </ContentTemplate>
        <Triggers>
            <asp:PostBackTrigger ControlID="dvAssignment" /> 
        </Triggers>
    </asp:UpdatePanel>
protected void Page_Load(object sender, EventArgs e)
{
    this.Page.Form.Enctype = "multipart/form-data";
}

请确保同一页上只有一个

是否在每次回发时都重新绑定DetailsView?我只在Gridview的SelectedIndexChanged上绑定DetailsView。Gridview有一个编辑链接,它触发DetailsView进行绑定并变为可见。我在我的一个项目中执行相同的操作,并且我有一个imag触发上传的电子按钮我在你的代码中看不到,我的按钮的原因验证设置为false,但不确定它是否重要。我正在尝试使用内置的更新链接提交详细信息。VIEWI使用下面的链接解决了相同的问题否我没有尝试过,我使用了更改的事件,因为我需要Deta的数据绑定ilsView将在GridView的索引更改后发生,而不是在更改过程中发生。我不认为这是问题所在。好的,我创建了一个测试页面,没有GridView,只是一个Detailsview,并测试了您的代码,在dvAssignment\u项上更新它运行得非常完美。因此,它肯定与您的GridView有关,但它不允许它运行工作正确。你介意把你的gridview的代码片段放进去,这样我就可以用它来测试了吗?我已经添加了一些gridview的代码片段,这非常基本,你知道了,太棒了,如果你不设置表单“multipart/form data”,我在PHP中也看到了这一点“它不认识文件上传,也不知道.net需要它……我想我们每天都会学到一些新东西,嗯……)索引超出范围。必须是非负的并且小于集合的大小。我在我的save函数中编写了它,该函数是从dvAssignment\u itemUpdateng调用的,这是一个非常好的答案。我在一个UpdatePanel上上传了文件,并进行了完整的回发,但当有人第一次点击页面时,它就不起作用了。但现在它是!那要花上好几天才能找到解决办法!
                            <asp:FileUpload runat="server" ID="fileuploadNomination" />
                        </EditItemTemplate>
                    </asp:TemplateField>
 </Fields>
                </asp:DetailsView >       
            </asp:Panel>
         </ContentTemplate>
        <Triggers>
            <asp:PostBackTrigger ControlID="dvAssignment" /> 
        </Triggers>
    </asp:UpdatePanel>