“问题”是我在FormView中有一个ASP.NET TextBox,其Text属性绑定到数据库表字段。在某些情况下,可能会在数据库中将HTML代码与普通文本结合使用。 RequestEncoding和ResponseEncoding设置为“iso-8859-1”(whitch是latin1)。有些字段可以组合拉丁字符和西里尔字符。输入西里尔字符(例如“д”)时没有问题。因为RequestEncoding也设置为iso-8859-1和浏览器的charset,浏览器将更改为“д”,它将保存在数据库中。这就是我想要的,但因为“д”将被转换为“& amp;#1076;”在将响应输出发送到浏览器之前设置为ASP.NET TextBox的Text-property时,我看到“д”保存数据后。
有人能告诉我如何阻止ASP.NET进行转换吗?
或者:在所有控件都已呈现后,有没有办法改变ASPX网站的完全输出? - 我可以用“&#”替换“& amp;#”。
答案 0 :(得分:1)
我完成了这个,只是从Textbox继承并覆盖Text属性。它目前具有PersistenceMode.EncodedInnerDefaultProperty属性。您想将其更改为InnerDefaultProperty:
[BindableAttribute(true, BindingDirection.TwoWay)]
[PersistenceModeAttribute(PersistenceMode.EncodedInnerDefaultProperty)]
public virtual string Text { get; set; }
如果您希望将其应用于所有文本框,则可以使用标记映射来执行此操作。
参考资料
More on Persistence Mode
More on Textbox.Text property
More on Tag Mapping
答案 1 :(得分:0)
您可以在将文本插入数据库之前对其进行解码:
string htmlEncodedText = myTextbox.Text;
string htmlDecodedText = HttpUtility.UrlDecode(htmlEncodedText);
Encoding latinEncoding = Encoding.GetEncoding("8859-1");
Encoding utfEncoding = Encoding.UTF8;
byte[] utfBytes = utfEncoding .GetBytes(htmlDecodedText);
byte[] latinBytes =
System.Text.Encoding.Convert(utfEncoding, latinEncoding, utfBytes);
string latinString = latinEncoding.GetString(latinBytes);
// TODO: Insert latinString into database
答案 2 :(得分:0)
我解决了我的问题(PortageMonkey向我展示了道路):
首先,我创建了一个继承自System.Web.UI.WebControls.TextBox的类“IsoTextBox”。由于Text属性始终返回非编码字符串,因此只需更改Text属性即可完成此任务。相反,我覆盖了渲染方法:
protected override void Render(HtmlTextWriter writer)
{
StringWriter stringWriter = new StringWriter();
HtmlTextWriter source = new HtmlTextWriter(stringWriter);
base.Render(source);
writer.Write(stringWriter.ToString().Replace("&#", "&#"));
}
然后在web.config中添加了tagMapping:
<system.web>
<pages>
<tagMapping>
<add mappedTagType="MyNamespace.IsoTextBox" tagType="System.Web.UI.WebControls.TextBox"/>
</tagMapping>
</pages>
<globalization requestEncoding="iso-8859-1" responseEncoding="iso-8859-1"/>
</system.web>
这非常有用!