我的强类型视图中有一个 TextArea 定义为
@Html.TextAreaFor(x => x.Text)
我的控制器 Action 最初看起来与此类似:
[HttpPost]
public ViewResult Index(MyViewModel vm)
{
using (var db = new MyEntities())
{
Post p = new Post();
p.Text = vm.Text;
db.Posts.AddObject(p);
db.SaveChanges();
}
return View();
}
这工作得很好。用户在 TextArea 中输入的文本被传递到控制器并通过实体框架保存到 SQL Server 中的 Post 表中。该字段的数据类型是 varchar(1000)。(还有使用带有 [StringLength(1000)] 验证的 MetadataType 对 Text 字段进行模型验证。)
我注意到如果我尝试复制一些 HTML 源并将其粘贴到 TextArea 并提交,我会收到以下错误:
“从客户端检测到潜在危险的 Request.Form 值”
这个错误让我想到了这个问题,从中得到的收获是我可以简单地添加
[HttpPost, ValidateInput(false)]
到我的 Action 来停止这种类型的验证。这非常有效,但令我惊讶的是,无论我尝试将什么放入 TextArea,我都不会造成任何问题。如果我粘贴充满引号字符的 javascript、html 或 T-SQL 语句,它仍然可以正常工作。我看到我输入到 TextArea 的确切字符出现在 SQL 表中,如果我将文本显示回视图,我在源代码中看到每个字符都转换为 HTML 对应字符,屏幕上的显示看起来就像当我输入它时它确实如此。我没有进行任何类型的文本转换来完成此操作。默认情况下,一切似乎都按照我的意愿工作。当然我很高兴,但是当我读到禁用验证时,通常会伴随着一个警告,你应该了解这样做的后果,我想我不会。所以我想知道,后果是什么?是否有人可能会在我的 TextArea 中输入任何内容,由于禁用输入验证而导致事情变得混乱?
如果相关,我的特定设置是 MVC4、.NET 4.0、Entity Framework 4.4、SQL Server 2012 Express。