Отформатируйте данные в UpdatePanel перед сохранением - PullRequest
1 голос
/ 01 июля 2011

Я использую UpdatePanel в ASP.NEt WebForms для загрузки изображения. Я хочу сохранить имя файла в базе данных, но НЕ путь. Я использую следующий код

 <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>

1 Ответ

1 голос
/ 05 января 2012

Вы связываете атрибут ImageUrl в своем ItemTemplate (возможно, в GridView или FormView?).

<EditItemTemplate>
  <asp:UpdatePanel...>
    ...
    <ContentTemplate>
      ..
      <asp:Image ID="Image1" runat="server" ImageUrl='<%# Bind("pic") %>' />
    </ContentTemplate>
  </asp:UpdatePanel>
</EditItemTemplate>

Поэтому при обновлении это значение будет привязано к <asp:Parameter Name="pic" /> в элементе управления SqlDataSource.Но в коде файла вы устанавливаете это значение на полный виртуальный путь (потому что вы хотите, чтобы изображение отображалось правильно).

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;
...