保存之前在UpdatePanel中格式化数据
本文关键字:格式化数据 UpdatePanel 保存 | 更新日期: 2023-09-27 18:00:54
我正在使用ASP.NetWebForms中的UpdatePanel上传图像。我想将文件名保存在数据库中,但不想保存路径。我正在使用以下代码
<asp:TemplateField FooterText="Image 1" HeaderText="Image 1">
<ItemTemplate>
<asp:Image ID="Image11" runat="server" ImageUrl='<%# Bind("pic") %>' Height="50px" onerror="this.style.display='none'" />
</ItemTemplate>
<EditItemTemplate>
<asp:UpdatePanel ID="updatPanelImg1" UpdateMode="Conditional" runat="server">
<Triggers>
<asp:PostBackTrigger ControlID="uploadbutton" />
</Triggers>
<ContentTemplate>
<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button runat="server" Text="Add image" OnClick="UploadbuttonClick" />
<asp:Image ID="Image1" runat="server" ImageUrl='<%# Bind("pic") %>' onerror="this.style.display='none'" />
</ContentTemplate>
</asp:UpdatePanel>
</EditItemTemplate>
</asp:TemplateField>
在UploadbuttonClick方法中,我将路径设置为图像宽度Image1.ImageUrl = virtualFilePath;
,其中virtualFilePath
是文件的完整虚拟路径。保存数据时,数据库包含文件的完整路径,但我只知道文件名。
编辑1:UploadbuttonClick:的代码
protected void UploadbuttonClick(object sender, EventArgs e)
{
var button = (Button)sender;
var fileUpload = (FileUpload)button.Parent.FindControl("FileUpload1");
var imageViewer = (Image)button.Parent.FindControl("Image1");
if (fileUpload.HasFile)
{
string fileName = fileUpload.FileName;
fileName = RemoveInvalidChars(fileName);
const string virtualPath = @"/images/news/";
string serverPath = Server.MapPath(virtualPath);
string serverFilePath = Path.Combine(serverPath, fileName);
string virtualFilePath = Path.Combine(virtualPath, fileName);
fileUpload.SaveAs(serverFilePath);
imageViewer.ImageUrl = virtualFilePath;
}
}
编辑2:保存到数据库的代码
<asp:SqlDataSource
ID="SqlDataSourceNews"
runat="server"
ConnectionString="<%$ ConnectionStrings:connectionString %>"
UpdateCommand="UPDATE [foo] SET [pic] = @pic WHERE [id] = @id">
<UpdateParameters>
<asp:Parameter Name="pic" Type="String" />
</UpdateParameters>
<InsertParameters>
<asp:Parameter Name="pic" Type="String" />
</InsertParameters>
</asp:SqlDataSource>
您正在ItemTemplate中绑定ImageUrl
属性(可能在GridView或FormView中?(。
<EditItemTemplate>
<asp:UpdatePanel...>
...
<ContentTemplate>
..
<asp:Image ID="Image1" runat="server" ImageUrl='<%# Bind("pic") %>' />
</ContentTemplate>
</asp:UpdatePanel>
</EditItemTemplate>
因此,更新时,该值将绑定到SqlDataSource
控件中的<asp:Parameter Name="pic" />
。但在代码隐藏文件中,您将此值设置为完整的虚拟路径(因为您希望图像正确显示(。
var imageViewer = (Image)button.Parent.FindControl("Image1");
...
imageViewer.ImageUrl = virtualFilePath;
这就是为什么这个完整的虚拟路径被保存到数据库中的原因。要修复它,您必须将参数值绑定到隐藏控件,并且仅对图像控件使用eval:
<asp:Hidden ID="ImageFileName" runat="server" Value='<%# Bind("pic") %>' />
<asp:Image ... ImageUrl='<%# Eval("pic", "~/images/news/{0}") %>'
在代码隐藏中,将隐藏控件的值设置为文件名:
var imageViewer = (Image)button.Parent.FindControl("Image1");
var imageFileName = (Hidden)button.Parent.FindControl("ImageFileName");
...
imageViewer.ImageUrl = virtualFilePath;
imageFileName.ImageUrl = fileName;