您好我尝试在详细信息视图中添加文件上载我在这里附加了我的代码中的一些部分:
<asp:DetailsView ID="DetailsView1" runat="server" Height="50px" Width="586px"
DefaultMode="Edit" AutoGenerateRows="False" BorderColor="White"
BorderStyle="None" DataSourceID="EntityDataSource1" GridLines="None" DataKeyNames="UserName" OnItemUpdated="DetailsView1_ItemUpdated" ONItemEditing="DetailsView1_ItemEditing">
然后将fileupload控件放在模板字段中:
<asp:TemplateField HeaderText="Foto">
<EditItemTemplate>
<asp:FileUpload ID="FileUpload1" runat="server" />
</EditItemTemplate>
</asp:TemplateField>
,数据源是:
<asp:EntityDataSource ID="EntityDataSource1" runat="server"
ConnectionString="name=mesteriEntities" DefaultContainerName="mesteriEntities"
EnableFlattening="False" EntitySetName="Users"
EnableUpdate="True" AutoGenerateWhereClause="True"
EnableInsert="True">
<WhereParameters>
<asp:SessionParameter Name="UserName" SessionField="New" Type="String" />
</WhereParameters>
</asp:EntityDataSource>
背后的代码:
protected void DetailsView1_ItemEditing(object sender, DetailsViewInsertEventArgs e)
{
FileUpload fu1 = (FileUpload)DetailsView1.FindControl("FileUpload1");
if (fu1 == null)
e.Cancel = true;
if (fu1.HasFile)
{
try
{
string fileName = Guid.NewGuid().ToString();
string virtualFolder = "~/UserPics/";
string physicalFolder = Server.MapPath(virtualFolder);
// StatusLabel.Text = "Upload status: File uploaded!";
string extension = System.IO.Path.GetExtension(fu1.FileName);
fu1.SaveAs(System.IO.Path.Combine(physicalFolder, fileName + extension));
e.Values["foto"] = System.IO.Path.Combine(physicalFolder, fileName + extension);
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
}
else
e.Cancel = true;
}
我不确定为什么不起作用。它不会在服务器上传文件,也不会在文件的数据库中添加引用。我在这里做错了吗?
谢谢
答案 0 :(得分:2)
据我所知(从查看类文档:DetailsView Class),没有要处理的OnItemEditing事件?
然而,有一个DetailsView.ItemUpdating事件似乎可以解决这个问题:
单击DetailsView控件中的“更新”按钮时发生, 但在更新操作之前。
另外我认为无法找到FileUpload控件,因为FindControl方法没有搜索它包含的控件的完整层次结构。
尝试使用以下方法并修改代码,如下所示:
FileUpload fu1 = (FileUpload)FindControl(DetailsView1, "FileUpload1");
...
private Control FindControl(Control parent, string id)
{
foreach (Control child in parent.Controls)
{
string childId = string.Empty;
if (child.ID != null)
{
childId = child.ID;
}
if (childId.ToLower() == id.ToLower())
{
return child;
}
else
{
if (child.HasControls())
{
Control response = FindControl(child, id);
if (response != null)
return response;
}
}
}
return null;
}