允许用户在ASP.NET MVC中inputHTML – ValidateInput或AllowHtml

我怎样才能让用户使用ASP.net MVCinputHTML到特定的字段。

我有一个很长的forms,有很多字段映射到控制器中的这个复杂的对象。

我想在一个领域(描述)允许HTML,我将在稍后的时间对自己的卫生进行预处理。

在控制器中添加以下属性action(post)以允许HTML:

[ValidateInput(false)] 

编辑:根据查理诺评论:

在你的web.config中设置使用的validation模式。 请参阅MSDN :

 <httpRuntime requestValidationMode="2.0" /> 

编辑2014年9月:根据sprinter252评论:

您现在应该使用[AllowHtml]属性。 从MSDN看下面:

对于ASP.NET MVC 3应用程序,当您需要将HTML发回您的模型时,请勿使用ValidateInput(false)closures请求validation。 只需将[AllowHtml]添加到您的模型属性,如下所示:

 public class BlogEntry { public int UserId {get;set;} [AllowHtml] public string BlogText {get;set;} } 

那么属性上面的[AllowHtml]属性呢?

添加到模型:

 using System.Web.Mvc; 

和你的财产

  [AllowHtml] [Display(Name = "Body")] public String Body { get; set; } 

这个代码从我的angular度来说是避免这个错误的最好方法。 如果您使用的是HTML编辑器,您将不会遇到安全问题,因为它已经受到限制。

build议在特定属性上添加[AllowHtml] ,因为有许多博客和评论build议降低安全级别,这应该是不可接受的。

通过添加,MVC框架将允许控制器被击中,并且该控制器中的代码被执行。

但是,这取决于您的代码,filter等,如何生成响应以及是否有任何进一步的validation可能触发另一个类似的错误。

无论如何,添加[AllowHtml]属性是正确的答案,因为它允许html在控制器中被反序列化。 你的viewmodel中的例子:

 [AllowHtml] public string MessageWithHtml {get; set;} 

我遇到了同样的问题,虽然我添加了[System.Web.Mvc.AllowHtml]有关财产如一些答案中所述。

在我的情况下,我有一个UnhandledExceptionFilter类, MVCvalidation发生之前访问Request对象(因此AllowHtml没有效果),并且此访问引发了[HttpRequestValidationException] A potentially dangerous Request.Form value was detected from the client

这意味着,访问某个Request对象的某些属性隐式激发validation(在我的情况下,它的Params属性)。

MSDN上logging了一个防止validation的解决scheme

要为请求中的特定字段(例如,对于input元素或查询string值)禁用请求validation,请在获取该项时调用Request.Unvalidated方法,如下例所示

因此,如果你有这样的代码

 var lParams = aRequestContext.HttpContext.Request.Params; if (lParams.Count > 0) { ... 

改变它

 var lUnvalidatedRequest = aRequestContext.HttpContext.Request.Unvalidated; var lForm = lUnvalidatedRequest.Form; if (lForm.Count > 0) { ... 

或者只是使用似乎不会触发validation的Form属性

 var lForm = aRequestContext.HttpContext.Request.Form; if (lForm.Count > 0) { ... 

在使用NopCommerce开发电子商务网站的过程中,我遇到了这个问题,我通过3种不同的方式得到了这个解决scheme,就像以前的答案一样。 但根据NopCommerce的结构,我一次也没有find这三个。 我刚刚看到,他们正在使用只是[AllowHtml] ,它工作正常,除了任何问题。 正如之前提出的问题

我个人不喜欢[ValidateInput(false)]因为我跳过总模型实体检查,这是不安全的。 但如果有人只是写在这里看看

 [AllowHtml] public string BlogText {get;set;} 

那么它只是跳过单一的财产,只允许特定的财产,并检查几乎所有其他实体。 所以对我来说似乎更好。

在我的情况下,与OutputCache操作filter结合使用时,AllowHtml属性不起作用。 这个答案为我解决了这个问题。 希望这有助于某人。