允许用户在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属性不起作用。 这个答案为我解决了这个问题。 希望这有助于某人。