我正在使用xml作为文件上传器的数据库。我上传了文件并生成了xml,但是我遇到了创建麻烦和“admin”页面,它将所有条目列入数据库,并为用户提供删除条目的选项,以及向条目添加首字母但这不是我需要帮助的。我正确地使用了XML,但创建了一个删除按钮,我意识到我需要使用<asp:GridView>
。
我很难让我的XML甚至可以使用gridView进行显示。我想我有删除按钮的功能,但由于这个问题无法测试。任何帮助将不胜感激。
我的代码:
admin.aspx
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="adminXML" runat="server" />
</div>
</form>
</body>
</html>
resdat.xml
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<resdat>
<entry>
<date>SomeDate</date>
<filename>someFile.jpg</filename>
<filePath>http://google.com</filePath>
<initials></initials>
</entry>
<entry>
<date>11-11-2013</date>
<filename>owl2.jpg</filename>
<filePath>http://somewebsite.com/data/owl2.jpg</filePath>
<initials></initials>
</entry>
<entry>
<date>11-11-2013</date>
<filename>wildtextures-old-paper-texture-3.jpg</filename>
<filePath>http://somewebsite.com/data/wildtextures-old-paper-texture-3.jpg</filePath>
<initials></initials>
</entry>
<entry>
<date>11-11-2013</date>
<filename>QwbRElE_.m4a</filename>
<filePath>http://somewebsite.com/data/QwbRElE_.m4a</filePath>
<initials></initials>
</entry>
</resdat>
admin.aspx.cs
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Collections.Generic;
using System.Xml;
using System.Xml.Linq;
using System.Linq;
namespace fileUploader
{
public partial class admin : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
XmlDataSource xmlDS = new XmlDataSource();
xmlDS.EnableCaching = false;
xmlDS.DataFile = "~/App_Data/resdat.xml";
xmlDS.TransformFile = "~/App_Data/adminFormat.xslt";
xmlDS.XPath = "/resdat";
adminXML.DataSource = xmlDS;
adminXML.DataBind();
adminXML.Visible = true;
}
private void btn_Delete(object sender, EventArgs e)
{
//XmlDocument resdat = new XmlDocument();
//resdat.Load("~/App_Data/resdat.xml");
// resdat.Save(Server.MapPath("~/App_Data/resdat.xml"));
}
}
}
adminFormat.xslt
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="html" indent="yes"/>
<!-- This is old code for the <asp:Xml> format -->
<!--<xsl:template match="/resdat">
<h3>Entries in XML Database</h3>
<table>
<thead>
<tr>
<td>Date</td>
<td>File</td>
<td>Initials</td>
<td>Delete</td>
</tr>
</thead>
<xsl:for-each select="entry">
<tr>
<td>
<xsl:value-of select="date"/>
</td>
<td>
<a>
<xsl:attribute name="href">
<xsl:value-of select="filePath"/>
</xsl:attribute>
<xsl:value-of select="filename"/>
</a>
</td>
<td>
<xsl:value-of select="initials"/>
</td>
<td>
<input type="button" value="delete" onClick="btn_Delete" >
<xsl:attribute name="id">
<xsl:value-of select="filename"/>
</xsl:attribute>
</input>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:template>-->
<xsl:template match="/">
<resdat>
<xsl:apply-templates/>
</resdat>
</xsl:template>
<xsl:template match="entry">
<entry>
<xsl:apply-templates select="*"/>
</entry>
</xsl:template>
<xsl:template match="resdat/entry/*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
我已经在网络上搜寻了所有人,但到目前为止找不到任何对我有用的资源。任何帮助将不胜感激。
tl:dr需要在表格格式的每个“条目”旁边都有一个删除按钮。找不到一个好的解决方案,删除按钮/无法让xml正确加载到datagrid中。任何帮助表示赞赏。
答案 0 :(得分:1)
我认为你遇到的一个问题是你的xpath表达式
xmlDS.XPath = "/resdat";
这应该是一个xpath表达式来选择网格的“行”。在您的情况下,您需要为每个条目元素添加一行,因此它应该如下所示
xmlDS.XPath = "/resdat/entry";
事实上,你可以通过评论这一行来逃避,因为它会假设根元素的子元素是这种情况下的记录。
至于执行“删除”按钮,值得指出的是,XmlDataSource控件是一个只读数据源,因此它并不适用于可编辑的GridView。但是,如果您确实想坚持下去,则需要手动指定列,而不是自动生成列,并指定一个按钮字段来执行删除:
<asp:GridView ID="adminXML" runat="server" AutoGenerateColumns="False" OnRowCommand="adminXML_RowCommand" >
<Columns>
<asp:BoundField HeaderText="File Name" DataField="filename" SortExpression="ProductID" />
<asp:ButtonField CommandName="Del" Text="Delete" />
</Columns>
</asp:GridView>
然后,在您的代码后面,您将拥有代码来处理自行删除行
protected void adminXML_RowCommand(object sender, CommandEventArgs e)
{
if (e.CommandName == "Del")
{
/*
Do Delete
*/
}
}
如果查看事件参数 e 的属性,您会看到CommandArgument属性设置为要删除的行的行索引。
要记住的一件事是,您正在对每个页面加载进行数据绑定,在这种情况下,您只需要在首次访问页面时执行此操作,而不是在回发时进行。此外,由于您将负责自行删除XML行,因此在执行删除操作后需要重新绑定网格。因此,您的代码可能看起来像这样
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
BindDataSource();
adminXML.Visible = true;
}
}
protected void adminXML_RowCommand(object sender, CommandEventArgs e)
{
if (e.CommandName == "Del")
{
/*
Do Delete
*/
BindDataSource();
}
}
private void BindDataSource()
{
XmlDataSource xmlDS = new XmlDataSource();
xmlDS.EnableCaching = false;
xmlDS.DataFile = "~/App_Data/resdat.xml";
xmlDS.TransformFile = "~/App_Data/adminFormat.xslt";
xmlDS.XPath = "/resdat/entry";
adminXML.DataSource = xmlDS;
adminXML.DataBind();
}
当然,为了实现这一点,您几乎肯定必须修改XML文档的权限以允许asp.net用户使用它来编写。如果两个用户同时尝试修改XML文档,您还必须考虑会发生什么。
理想情况下,当您拥有可编辑的数据源时,应考虑使用SQL数据源(例如Microsoft的SQL Compact)。