在我的foreach中包含html的格式DataRow
问题描述:
我正在使用DataSet显示数据库中的选定字段。在我的foreach中包含html的格式DataRow
foreach (DataRow row in dsNews.Tables["News"].Rows)
{
newsTitle.Text += "<dd>";
newsTitle.Text += "<p><a href=""news-edit?id=" + row["newsID"] + """>" + row["newsTitle"] + "</a></p>";
newsTitle.Text += "</dd>";
}
最终它将被用于编辑新闻帖子。
下面的行给我的麻烦:
newsTitle.Text += "<p><a href=""news-edit?id=" + row["newsID"] + """>" + row["newsTitle"] + "</a></p>";
是上面的格式不正确?很明显,我想要做什么 - 但编译器要求;
我不知道为什么。
答
您尚未正确处理您的报价。如果你想要双引号属性,你需要用反斜杠来隐藏嵌入的双引号。
newsTitle.Text += "<p><a href=\"news-edit?id=" + row["newsID"] + "\">" + row["newsTitle"] + "</a></p>";
或者更容易切换到您的属性的单引号。它因此变成:
newsTitle.Text += "<p><a href='news-edit?id=" + row["newsID"] + "'>" + row["newsTitle"] + "</a></p>";
但是,这是一种将重复内容注入到您的网页的可怕方式。相反,定义一个类来表示你的数据:
public class Article
{
public int Id { get; set; }
public string Title { get; set; }
}
在你的代码
然后,检索文章的收集和将它们绑定到一个中继器。
Web窗体
<asp:Repeater runat="server" id="ArticleRepeater" ItemType="MyNamespace.Article">
<ItemTemplate>
<p>
<a href="news-edit?id=<%#: Item.Id %>"><%#: Item.Title %></a>
</p>
</ItemTemplate>
</asp:Repeater>
代码隐藏
IEnumerable<Article> articles = DataLayer.GetArticles();
ArticleRepeater.DataSource = articles;
ArticleRepeater.DataBind();
显然,你需要实现某种形式的数据层,有可能使用ORM如实体框架或微型ORM如Dapper。
答
你在用什么语言?对于C#和Javascript,你不会逃避你的报价。
所以这行:
newsTitle.Text += "<p><a href=""news-edit?id=" + row["newsID"] + """>" + row["newsTitle"] + "</a></p>"
读取
newsTitle.Text += "<p><a href="
"news-edit?id=" + row["newsID"] + ""
">" + row["newsTitle"] + "</a></p>"
您有一个分配和两个字符串没有做更多的事情(除了语法错误)
在结束了javascript,你可以通过使用半引号来解决这个问题:
newsTitle.Text += '<p><a href=""news-edit?id=' + row["newsID"] + '"">' + row["newsTitle"] + '</a></p>'
......这表明了另一个担忧;你的href正在被打开和关闭,没有内容。
在C#中,你可以使用:
newsTitle.Text += "<p><a href=\"\"news-edit?id=" + row["newsID"] + "\"\">" + row["newsTitle"] + "</a></p>"
...仍然看起来并不像它会给你真正寻找的。
+1
你应该解释如何纠正它。 – mason
非常感谢@mason。我不明白你怎么不需要让一个类来读取你的数据?绑定的中继器可以完成相同的工作,然后您可以使用Eval等等。但是,您正在使用的是get;组;只是一个更好的方法呢?谢谢... – davvv
@davvv表示数据的强类型类(模型)在C#中比在DataTable中处理起来要容易得多。绑定到中继器的DataTable将依赖“魔术字符串”来获取列,但您不会收到Intellisense,并且它无法在编译时告诉您列名在Eval调用中是不同步的。它只会在运行时失败。模型也比DataTable使用的内存少得多。 – mason