我在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个字符)。
最好的方法是什么?
答案 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
是的,对于发现的一个错误,必须更新大量文本字段可能是一件令人失望的事。但这就是野兽的本性。老实说,我希望有人能有另一个解决方案。但是错误就是它们。