Загрузка файла из подробного просмотра в режиме редактирования - PullRequest
0 голосов
/ 23 сентября 2011

Здравствуйте, я пытаюсь добавить файл загрузки внутри подробного просмотра. Я прикрепляю сюда некоторые части из моего кода:

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

, тогда управление загрузкой файла помещается внутри поля шаблона:

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



    }

Я не уверен, почему не работает. Он не загружает файл на сервер и не добавляет ссылку в базу данных файла. Что я тут сделал не так?

спасибо

1 Ответ

2 голосов
/ 23 сентября 2011

Насколько я могу судить (из документации по классу: 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;
}
...