listview上的FileUpload

时间:2013-11-25 21:05:53

标签: c# asp.net xml listview file-upload

我有ListView,它显示来自XML的信息,并从此ListView上的FileUpload保存到服务器。我没有写入XML的问题,问题在于将FileUpload保存到文件夹。

  1. 我相信我错了,我没有将listview分开到itemtemplate和insertemplate并编辑......它必须?因为标题会在XML上更正,甚至文件名。但文件未保存到文件夹中。

  2. 对于我做的大多数测试 - 点击“更新”BTN后没有任何事情发生。当我将int“i”添加到items [i]时,它只是在不保存文件的情况下更新xml,有时我会收到“out of index”错误。

  3. 有什么问题?

    ASPX代码

    <h2><asp:Label ID="LBL_number" runat="server" Text='<%#XPath("id") %>'></asp:Label></h2>
    <h2>Small Image</h2> <asp:Image Width="100"  CssClass="ltr" runat="server" ID="TB_small" ImageUrl='<%# XPath("small_image_url") %>'></asp:Image><asp:FileUpload ID="FU_small" runat="server" />
    <br /><br /><br />
    <h2>Big Image</h2> <asp:Image Width="300" CssClass="ltr" runat="server" ID="TB_big" ImageUrl='<%#XPath("big_image_url") %>'></asp:Image><asp:FileUpload ID="FU_big" runat="server" />
    <br /><br />
    <h2>Title</h2> <asp:TextBox runat="server" ID="TB_title" Text='<%#XPath("title") %>'></asp:TextBox>
    <br /><br /><br />
    <asp:Button CssClass="btn" ID="Button1" CommandArgument='<%#XPath("id") %>' runat="server"  OnClick="update"  Text="Update" />
    <br />
    <asp:Button ID="Button3" CssClass="btn" CommandArgument='<%#XPath("id") %>' runat="server" CommandName="del"  OnClick="del" Text="מחק" />
    <br /><br />
    <br /><br />
    </ItemTemplate>
    
    </asp:ListView>
    <asp:XmlDataSource ID="XDS_data" runat="server" 
      DataFile="~/App_Data/AM_data.xml" XPath="/Data/datas/data">
    </asp:XmlDataSource>
    

    C#仅使用小文件上传示例。

    protected void update(object sender, EventArgs e)
    {
        XmlDocument doc = new XmlDocument();
        doc.Load(Path.Combine(Request.PhysicalApplicationPath, "App_Data/AM_data.xml"));
        Button myButton = (Button)sender;
        int i = Convert.ToInt32(myButton.CommandArgument.ToString());
        var FU_small1 = (FileUpload)myButton.FindControl("FU_small");
        string extenstion_small = System.IO.Path.GetExtension(FU_small1.FileName);
        filename_small = Guid.NewGuid().ToString();
    
        FileUpload fu2 = LV_data.Items[i].FindControl("FU_small") as FileUpload;
        if (fu2.HasFile == true)
         {
            fu2.SaveAs(Server.MapPath("~/imgs/data/big" + filename_small.ToString() +  extenstion_small.ToString()));    
         }
    
            var TB_title = (TextBox)myButton.FindControl("TB_title");
            string myString3 = TB_title.Text;
    
            XmlElement el = (XmlElement)doc.SelectSingleNode("Data/datas/data[id='" + i + "']");
            el.SelectSingleNode("small_image_url").InnerText = "~/imgs/data" + filename_small + extenstion_small;
            el.SelectSingleNode("title").InnerText = myString3;
            el.SelectSingleNode("big_image_url").InnerText = "~/imgs/data" + filename_big + extenstion_big;
    
            doc.Save(Path.Combine(Request.PhysicalApplicationPath, "App_Data/AM_data.xml"));
    
            Response.Redirect(Request.RawUrl);
    
    }
    

2 个答案:

答案 0 :(得分:1)

update方法有几个问题:

  1. 您需要在容器内找到控件,而不是在按钮内。 * 错误的方法:* var TB_title = (TextBox)myButton.FindControl("TB_title");
  2. 无法保证id符合ListView的项目索引。 * 错误的方法:* FileUpload fu2 = LV_data.Items[i].FindControl("FU_small") as FileUpload;
  3. 我建议将方法更改为:

    protected void update(object sender, EventArgs e)
    {
        int index = 0;
        XmlDocument doc = new XmlDocument();
        doc.Load(Path.Combine(Request.PhysicalApplicationPath, "App_Data/AM_data.xml"));
        Button myButton = (Button)sender;
        ListViewItem lvwItem = (ListViewItem)myButton.NamingContainer;
    
        FileUpload FU_small1 = myButton.FindControl("FU_small") as FileUpload;
    
        if (FU_small1 != null && int.TryParse(myButton.CommandArgument, out index))
        {
            string extenstion_small = System.IO.Path.GetExtension(FU_small1.FileName);
            filename_small = Guid.NewGuid().ToString();
    
            TextBox TB_title =  myButton.FindControl("TB_title") as TextBox;
            string myString3 = TB_title!= null ? TB_title.Text : string.Empty;
    
            if (FU_small1.HasFile == true)
            {
                FU_small1.SaveAs(Server.MapPath("~/imgs/data/small/" + filename_small + extenstion_small));
            }
            XmlElement el = (XmlElement)doc.SelectSingleNode("Data/datas/data[id='" + index + "']");
            el.SelectSingleNode("small_image_url").InnerText = "~/imgs/data/small/" + filename_small + extenstion_small;
            el.SelectSingleNode("title").InnerText = myString3;
            el.SelectSingleNode("big_image_url").InnerText = "~/imgs/data/big/" + filename_big + extenstion_big;
    
            doc.Save(Path.Combine(Request.PhysicalApplicationPath, "App_Data/AM_data.xml"));
        }
    
        Response.Redirect(Request.RawUrl);
    }
    

    here是我用来测试它的测试项目。

答案 1 :(得分:0)

Finnaly,“foreach”解决了它

protected void update(object sender, EventArgs e)
{
    //Get xml file 
    XmlDocument doc = new XmlDocument();
    doc.Load(Path.Combine(Request.PhysicalApplicationPath, "App_Data/AM_data.xml"));
    //Set button for index it later by CommandArgument
    Button myButton = (Button)sender;


    foreach (ListViewItem item in LV_data.Items)
    {
        //Findcontrol of 2 fileupload on listview
        FileUpload FU_small1 = (FileUpload)item.FindControl("FU_small1");
        FileUpload FU_big1 = (FileUpload)item.FindControl("FU_big1");

        //Check if are has file.
        if (FU_small1.HasFile && FU_big1.HasFile)
        {
            //Get extension and genereate random filenames (for avoid ovveride)
            FileInfo small_info = new FileInfo(FU_small1.FileName);
            FileInfo big_info = new FileInfo(FU_big1.FileName);
            string ext_small = small_info.Extension;
            string ext_big = big_info.Extension;
            string filename_small = Guid.NewGuid().ToString();
            string filename_big = Guid.NewGuid().ToString();

            //Set i value by button CommandArgument (look on aspx on question)
            int i = Convert.ToInt32(myButton.CommandArgument.ToString());

            //Get title from TextBox and set string from it
            TextBox TB_title = myButton.FindControl("TB_title") as TextBox;
            string myString3 = TB_title != null ? TB_title.Text : string.Empty;

            //Save the files from the fileuploads we found, and write it on xml
            FU_small1.SaveAs(Path.Combine(Request.PhysicalApplicationPath, "imgs/data/thumbs/" + filename_small + ext_small));
            FU_big1.SaveAs(Path.Combine(Request.PhysicalApplicationPath, "imgs/data/big/" + filename_big + ext_big));
            XmlElement el = (XmlElement)doc.SelectSingleNode("Data/datas/data[id='" + i + "']");
            el.SelectSingleNode("small_image_url").InnerText = "~/imgs/data/thumbs/" + filename_small  + ext_small;
            el.SelectSingleNode("title").InnerText = myString3;
            el.SelectSingleNode("big_image_url").InnerText = "~/imgs/data/big/" + filename_big + ext_big;

            doc.Save(Path.Combine(Request.PhysicalApplicationPath, "App_Data/AM_data.xml"));
        }
    }

    // Refresh the page
    Response.Redirect(Request.RawUrl);
    }