MVC多行换行常量导致sql server截断

时间:2013-06-10 18:34:49

标签: sql asp.net-mvc regex multiline truncate

我在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个字符),但是当Model绑定到Description字段时,它会用\ r \ n替换所有换行符,使它们有效地使用2个字符而不是1个,所以即使客户端和服务器端的正则表达式通过,当它保存到数据库时,nHibernate表示该字符串将被截断,因为它现在是2005个字符(因为每个换行符有2个字符)。

最好的方法是什么?

1 个答案:

答案 0 :(得分: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

我编辑了初始更改以使用字符串函数,因为它们比正则表达式更有效,并且查找换行符并不完全是“模式”。虽然,使用字符串方法,你不会用一个替换多个换行符,就像你使用'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

进行正则表达式替换有点重。这不是一个真正的问题,但如果你的替代品不需要模式匹配,那么使用字符串替换就不费吹灰之力了。话虽如此,替换功能非常有效并且不会弄乱。

由于mutliline文本框(或RTB)的本质就是它们,你将在返回时获得\ r \ n,而我知道摆脱它们的唯一方法就是用一些东西替换它们。我最初想要回答的问题是用管道替换它们,然后在输出时更改它们,但我不知道你的所有文本框接受了什么或它们的用途,所以我采用了上述响应的安全路线。 / p>

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

strlawl.replace(vbCr, Nothing)

但是,如果你想要返回值中的CR和LF,你最安全的方法是使用Regex查找任意数量或连续CR和/或LF组合的模式,并正确地用CRLF替换它们或NewLine。

所有这些,你说你有多个页面和多个文本区域。您的网页(代码隐藏)不应与您的数据库建立任何连接。他们应该使用数据层。项目中的单独DLL,或通过Web服务访问。至少,在该数据层中,您可以使用共享方法来减少或重新组合换行符。然后是txtBox.Text = fix(strValue)。您可以在txtFieldName.DataBound事件中执行此操作。

ASP Codebehind:

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

你的问题是关于MVC虽然,我不是很专业。但这是一个有用的链接。您可以使用以下提示实现我的答案:Custom Model

是的,对于发现的一个错误,必须更新大量文本字段可能是一件令人失望的事。但这就是野兽的本性。老实说,我希望有人能有另一个解决方案。但是错误就是它们。