0

我在具有以下属性的 MVC 模型上有一个简单的描述字符串字段:

[DataType(DataType.MultilineText)]
[DescriptionField]
public string Description { get; set; }

我的自定义 [DescriptionField] 只是使用多行选项进行正则表达式模式检查,如下所示: (.|\n){0,2000}

我在视图/客户端有一些自定义 javascript,它执行如下正则表达式: ([\s\S]){0,2000}

如您所见,两者都将字符限制为最多 2000 个,并且客户端和服务器端验证都可以正常工作,因此它们不允许超过 2000 个字符,但是如果我有 1995 个字符和 5 个换行符,这是完全可以接受的使用多行文本框,客户端和服务器端验证都正确通过,并且不允许更多。

此文本框的基础数据库字段是 sql varchar(2000 字符),但是当模型绑定到描述字段时,它用 \r\n 替换所有换行符,使它们有效地成为 2 个字符而不是 1 个,所以即使客户端和服务器端的正则表达式通过,当它保存到数据库时,nHibernate 表示字符串将被截断,因为它现在是 2005 个字符(因为每个换行符有 2 个字符)。

解决这个问题的最佳方法是什么?

4

1 回答 1

3

在 VB 中,这似乎工作正常:

Dim strlawl As String = "Hello" & vbCrLf & "Goodbye"
Dim lenlawl As Integer = strlawl.Length // = 14
strlawl = strlawl.replace(vbCrLf, vbLf)
lenlawl = strlawl.Length // = 13

我编辑了初始更改以使用字符串函数,因为它们比正则表达式更有效,并且找到换行符并不完全是“模式”。但是,使用 string 方法,您不会像使用 'regex.replace(strlawl, "[\r\n]+", vbLf)' 时那样用一个换行符替换多个换行符

但是,如果您发现在将其带回时需要同时具有换行符和回车符,您将需要使用正则表达式,因为上述字符串函数的逆会非常不稳定。所以:

strlawl = System.Text.RegularExpressions.Regex.Replace(strlawl, "[\r\n]+", Environment.Newline)

是的,为了向后兼容,我确实建议将 \r 和 \n 都保留在那里。另一方面,您很可能甚至不需要重新转换。换行应该导致没有回车的中断。但是,嘿,干净的代码就是干净的。

分解:

[       // Begins a new Character Class
    \r  // Allow matches for Carriage Return
    \n  // Also allow matches for Line Feed
]+      // Require at least one, but match as many as possible

进行正则表达式替换有点繁重。这不是一个真正的问题,但如果您的替换不需要模式匹配,那么使用字符串替换是很容易的。话虽这么说,替换功能非常有效,而且并不混乱。

由于多行文本框(或 RTB)的本质就是它们,你将在返回中得到 \r\n,而我知道摆脱它们的唯一方法是用一些东西替换它们。我最初回答这个问题的想法是用管道替换它们,然后在输出时将它们改回来,但我不知道你所有的文本框都接受什么或它们的目的,所以我选择了上述回复的安全路线。

话虽如此,另一种选择可能是:

strlawl.replace(vbCr, Nothing)

但是,如果您希望在返回值中同时包含 CR 和 LF,您最好使用正则表达式来查找任意数量的模式或连续 CR 和/或 LF 的组合,并用 CRLF 或 NewLine 正确替换它们。

话虽如此,您说您有多个页面和多个文本区域。您的网页(代码隐藏)不应与您的数据库有任何连接。他们应该使用数据层。项目中的单独 DLL,或通过 Web 服务访问。至少,在该数据层中,您可以有一个共享的方法来根据需要减少或重新合并换行符。然后txtBox.Text = fix(strValue)。你会在txtFieldName.DataBound活动中这样做。

ASP 代码隐藏:

Private Sub txtFieldName_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtFieldName.DataBound
    txtFieldName.Text = fix(strValue)
End Sub

你的问题是关于 MVC 虽然,我不是很专业。但这是一个有用的链接。您可以使用以下提示在此处实施我的答案:自定义模型

是的,为了发现一个错误而必须更新大量文本字段可能会很糟糕。但这就是野兽的本性。老实说,我确实希望有人有另一种解决方案。但是错误就是它们。

于 2013-06-10T19:21:00.967 回答