Sharepoint 检测SPItemEventReceiver中富格文本字段值的更改?

Sharepoint 检测SPItemEventReceiver中富格文本字段值的更改?,sharepoint,text,sharepoint-2007,Sharepoint,Text,Sharepoint 2007,我目前有一个附加到自定义列表的事件接收器。我当前的需求是为一个富文本字段实现列级安全性,该字段包含多行增强的富文本 根据此[webarchive],我可以获得字段的前后值,如下所示: object oBefore = properties.ListItem[f.InternalName]; object oAfter = properties.AfterProperties[f.InternalName]; 问题是,我正在运行比较这两个值的问题,这会导致误报代码在没有更改的情况下检测到更改 附

我目前有一个附加到自定义列表的事件接收器。我当前的需求是为一个富文本字段实现列级安全性,该字段包含多行增强的富文本

根据此[webarchive],我可以获得字段的前后值,如下所示:

object oBefore = properties.ListItem[f.InternalName];
object oAfter = properties.AfterProperties[f.InternalName];
问题是,我正在运行比较这两个值的问题,这会导致误报代码在没有更改的情况下检测到更改

附件A:在两个对象上使用ToString oBefore.ToString

问题

HTML标记是大写的 随机空间请参见边距后的附加空间: 使用或似乎产生相同的值

好的,你说,让我们比较一下纯文本值

附件B:使用 幸运的是,此方法将所有HTML标记从值中去掉,只显示纯文本。但是,使用此方法使我发现了空白字符的其他问题:

在before值中:

有时会有额外的换行符。 有时,空格显示为非中断空格ASCII字符代码160 问题: 如何检测用户是否更改了事件接收器中的富文本字段

[理想]检测对HTML、文本或空白的任何更改 [可接受]检测文本或空白的更改 [不太好]检测对文本字符的更改仅剥离所有非字母数字字符
如果使用新值设置ListItem字段并将其读回,会发生什么情况?这会给出相同的格式吗

object oBefore = properties.ListItem[f.InternalName];
properties.ListItem[f.InternalName] = properties.AfterProperties[f.InternalName]
object oAfter = properties.ListItem[f.InternalName];
//dont update
properties.ListItem[f.InternalName] = oBefore;

如果使用新值设置ListItem字段并将其读回,会发生什么情况?这会给出相同的格式吗

object oBefore = properties.ListItem[f.InternalName];
properties.ListItem[f.InternalName] = properties.AfterProperties[f.InternalName]
object oAfter = properties.ListItem[f.InternalName];
//dont update
properties.ListItem[f.InternalName] = oBefore;

我可能会在选项2和选项3之间尝试一些东西:

bool changed =
    valueAsTextBefore != valueAsTextAfter ||
    0 != string.Compare(
        oBefore.ToString().Replace(" ", ""), 
        oAfter.ToString().Replace(" ", ""), 
        true);
左半部分检查包含大小写的文本是否已更改,而右半部分检查标记或属性是否已更改。非常笨拙,但应该适合你的情况


我唯一能想到的另一件事是在HTML上运行XML转换,以标准化大小写和间距。但这不仅看起来有些过分,而且还假设HTML总是格式良好的。

我可能会在选项2和选项3之间尝试一些东西:

bool changed =
    valueAsTextBefore != valueAsTextAfter ||
    0 != string.Compare(
        oBefore.ToString().Replace(" ", ""), 
        oAfter.ToString().Replace(" ", ""), 
        true);
左半部分检查包含大小写的文本是否已更改,而右半部分检查标记或属性是否已更改。非常笨拙,但应该适合你的情况


我唯一能想到的另一件事是在HTML上运行XML转换,以标准化大小写和间距。但这看起来不仅有些过分,而且还假设HTML总是格式良好的。

我目前正在测试一种组合方法:GetFieldValueAsText,然后去掉除字母数字/标点符号以外的所有字符:

static string GetRichTextValue(string value)
{
    if (null == value)
    {
         return string.Empty;
    }
    StringBuilder sb = new StringBuilder(value.Length);
    foreach (char c in value)
    {
         if (char.IsLetterOrDigit(c) || char.IsPunctuation(c))
         {
              sb.Append(c);
         }
    }
    return sb.ToString();
}

这只检测富文本字段文本的更改,但似乎效果一致。

我目前正在测试一种组合方法:GetFieldValueAsText,然后去掉除字母数字/标点符号以外的所有字符:

static string GetRichTextValue(string value)
{
    if (null == value)
    {
         return string.Empty;
    }
    StringBuilder sb = new StringBuilder(value.Length);
    foreach (char c in value)
    {
         if (char.IsLetterOrDigit(c) || char.IsPunctuation(c))
         {
              sb.Append(c);
         }
    }
    return sb.ToString();
}

这只检测对富文本字段文本的更改,但似乎效果一致。

设置属性并再次将其取出似乎不会更改值。设置属性并再次将其取出似乎不会更改值。我正在考虑执行与第一部分类似的操作。我想我不能假设HTML格式良好,我正在考虑做一些类似于第一部分的事情。我认为我不能假设HTML格式良好。