本帖最后由 辉月 于 2013-11-16 18:05 编辑
字符串字段输出时带有</SCRIPT>标签,会导致JS代码被此标签截断,页面错误。
源码:FineUI.ControlBase的1183行
/// <summary>
/// 将控件的属性列表转化为JObject对象
/// </summary>
/// <param name="propertyList">属性列表</param>
/// <returns>属性列表的JObject形式</returns>
public JObject ConvertPropertiesToJObject(List<string> propertyList)
string propertyValueStr = propertyValue.ToString().Replace("</script>", @"<\/script>");
已对</script>做了转义,转义形式是<\/script>,未对</SCRIPT>做转义(虽然大写不符合标准,但是确实有不少人写代码会用大写)。
这样的转义效果不是我需要的,而且对大小写没有做匹配。
临时解决方案:
1183行修改为:
string propertyValueStr = Regex.Replace(propertyValue.ToString(), "</script>", "</scr\"+\"ipt>", RegexOptions.IgnoreCase);
889行的OnFirstPreRender修改为:
/// <summary>
/// 渲染 HTML 之前调用(页面第一次加载或者普通回发)
/// </summary>
protected virtual void OnFirstPreRender()
{
List<string> totalModifiedProperties = XState.GetTotalModifiedProperties();
if (totalModifiedProperties.Count > 0)
{
string propertyValue = ConvertPropertiesToJObject(totalModifiedProperties).ToString(Formatting.None).Replace("</scr\\\"+\\\"ipt>","</scr\"+\"ipt>");
OB.AddProperty("x_state", propertyValue, true);
}
else
{
OB.AddProperty("x_state", "{}", true);
}
……………………
}
可解决问题。
另,FineUI.JsHelper中也对</script>进行转义,同样可能存在这个问题,修改为:
/// <summary>
/// 返回的是双引号括起来的字符串,用来作为JSON属性比较合适
/// </summary>
/// <param name="s">源字符串</param>
/// <returns>双引号括起来的字符串</returns>
public static string Enquote(string s)
{
string jsonString = new JValue(s).ToString(Formatting.None);
// The browser HTML parser will see the </script> within the string and it will interpret it as the end of the script element.
// http://www.xiaoxiaozi.com/2010/02/24/1708/
// http://stackoverflow.com/questio ... n-javascript-string
jsonString = Regex.Replace(jsonString, "</script>", "</scr\"+\"ipt>", RegexOptions.IgnoreCase);
return jsonString;
}
|