在 asp.net 中处理 Gridview 控件中的文本框?

Posted

技术标签:

【中文标题】在 asp.net 中处理 Gridview 控件中的文本框?【英文标题】:Dealing with textbox within the Gridview control in asp.net? 【发布时间】:2014-10-25 15:43:20 【问题描述】:

我正在开发一个评论部分页面,我使用文本框、按钮和 gridview 控件来插入 cmets 并分别显示它们。我在 gridview 外面有一个文本框,用于添加 cmets,同时我在 gridview 内还有另一个文本框,用于添加对每个 cmets 的回复。我分别在 gridview 控件中显示了所有 cmets 和回复。我注意到,如果我使用下面的语法从位于 gridview 外部的文本框中输入 cmets

string comment = Server.htmlEncode(TextBox2.Text.Replace("'", "''"));
comment = Server.HtmlEncode(comment.Replace("\r\n", "<br/>"));

connection.Open();
string sql = "INSERT INTO [ComTab]([Name],[Comments]) Values('" + commentor + "','" + comment + "')";
SqlCommand cmd = new SqlCommand(sql, connection);
cmd.CommandType = CommandType.Text;

cmd.ExecuteNonQuery();
cmd.Dispose();
connection.Close();

如果您正在制作多段 cmets,我可以将此行 连同我的 cmets 一起保存到我的数据库中。所以没有任何问题,这就是我想要的。 现在相反,如果我使用以下代码在位于 gridview 内的文本框中输入回复

Button btn2 = (Button)sender;
GridViewRow row = (GridViewRow)btn2.NamingContainer;
TextBox gridtxt2 = row.FindControl("TextBox4") as TextBox;

string reply = Server.HtmlEncode(TextBox3.Text.Replace("'", "''"));
reply = Server.HtmlEncode(reply.Replace("\r\n", "<br/>"));

connection.Open();
string sql = "INSERT INTO [RepTab]([Name],[Replies]) Values('" + commentor + "','" + reply + "')";
SqlCommand cmd = new SqlCommand(sql, connection);
cmd.CommandType = CommandType.Text;

cmd.ExecuteNonQuery();
cmd.Dispose();
connection.Close();

我无法再将这一行连同我的回复一起保存到我的数据库中,这就是为什么如果用户输入多段落回复,它不会显示多段回复,而是压缩成一个长段落。那么我如何才能将这一行 连同我的回复一起保存到我的数据库中?有什么建议?谢谢...

【问题讨论】:

检测到 Sql 注入 :) 我确实希望有人会添加回复 ');删除表用户;-- 你有什么建议?什么意思? Ondrej 的意思是,如果您使用字符串连接来创建一个 SQL 字符串,然后发送到数据库,那么您很容易受到有人向您尝试执行的命令添加额外的 SQL 命令的攻击.这意味着有人可能会删除您的数据库,因为权限并没有阻止他。更好的方法是在查询中使用 SQL 参数,这样可以防止 SQL 注入。所以你可以把它叫做 sql = "insert into x(a,b) values(@paramA, @paramB)"。然后在下面你会调用 cmd.Parameters.AddWithValue("@paramA", textbox1.Value) 等。希望清除它。 您想从您的 html 回复中删除“”吗?? @Ganesh_Devlekar 不。我不想删除这一行 <br/><br/>输入回复时等于换行符或 以便在用户输入多段回复时我可以以正确的格式显示回复。 【参考方案1】:

无需将 \n 替换为 &lt;br/&gt; 或对其进行编码。您可以保存 \r\n,然后将其打印出来,文本框将显示新行。但是,如果您在没有控件的情况下将文本直接写入响应中,则需要确保有人没有将 javascript 注入到您的数据库中,这样在加载时可能会做一些讨厌的事情。

编辑 - 最终解决方案:

尝试设置网格中将响应呈现为的列的文本属性

Text='<%#  Eval("reply").ToString().Replace("\n", "<br />") %>'

保存到 db 时不要替换 \n。另外,一定要输出干净的JS代码,防止误用。

【讨论】:

这就是为什么我想知道为什么我可以显示多段 cmets 而当他们只是使用相同的代码时,不能显示多段内容的回复。因此其他人无法保存这一行<br/><br/>进入我的数据库。 我不能再保存这一行了<br/><br/>连同我的回复一起进入我的数据库,这就是为什么如果用户输入多段回复,它不会显示多段回复,而是被压缩成一个长段。那么我该如何保存这条线<br/><br/>连同我对数据库的回复?有什么建议?谢谢... 您使用哪个控件来显示 cmets,以及使用哪个控件来显示回复? 我使用嵌套的gridview来显示两者 您能否尝试将网格中将响应呈现为 Text='") %>' 并且在保存到 db 时不要替换 \n。

以上是关于在 asp.net 中处理 Gridview 控件中的文本框?的主要内容,如果未能解决你的问题,请参考以下文章

asp.net 如何访问gridview控件中每一行的label控件

asp.net的gridview控件问题

向导控件中的 Gridview 自定义分页在 asp.net 中无法正常工作

asp.net中GridView怎样进行分页,编辑,删除操作

ASP.NET 中GridView 控件的DataFormatString属性的用法

asp.net c# gridview的居中问题