如何允许用户使用ASP.net MVC将HTML输入特定字段。
我有一个很长的表单,其中有很多字段被映射到控制器中的这个复杂对象。
我想让一个字段(描述)允许HTML,我将在稍后的时候开始自己的卫生。
答案 0 :(得分:151)
在控制器中添加以下属性操作(post),以允许HTML:
[ValidateInput(false)]
修改根据Charlino评论:
在您的web.config中设置使用的验证模式。见MSDN:
<httpRuntime requestValidationMode="2.0" />
编辑2014年9月:根据sprinter252评论:
您现在应该使用[AllowHtml]
属性。请参阅下面的MSDN:
对于ASP.NET MVC 3应用程序,当您需要将HTML发布回 你的模型,不要使用ValidateInput(false)来关闭Request 验证。只需将[AllowHtml]添加到您的模型属性中,如下所示:
public class BlogEntry { public int UserId {get;set;} [AllowHtml] public string BlogText {get;set;} }
答案 1 :(得分:125)
属性上方[AllowHtml]
属性怎么样?
答案 2 :(得分:42)
添加到型号:
using System.Web.Mvc;
到你的财产
[AllowHtml]
[Display(Name = "Body")]
public String Body { get; set; }
此代码从我的观点来看避免此错误的最佳方法。如果您使用的是HTML编辑器,则不会出现安全问题,因为它已经受到限制。
答案 3 :(得分:9)
在特定属性上添加[AllowHtml]
是推荐的解决方案,因为有大量博客和评论暗示降低安全级别,这应该是不可接受的。
通过添加它,MVC框架将允许命中Controller并执行该控制器中的代码。
但是,这取决于您的代码,过滤器等,如何生成响应以及是否有任何可能触发其他类似错误的进一步验证。
在任何情况下,添加[AllowHtml]
属性都是正确的答案,因为它允许在控制器中反序列化html。 viewmodel中的示例:
[AllowHtml]
public string MessageWithHtml {get; set;}
答案 4 :(得分:6)
我遇到了同样的问题,尽管我在某些答案中描述了相关财产>>> class NArray(object):
def __init__(self, arr):
self.arr = arr
def array(self):
return self.arr
def __eq__(self, other):
if (other.arr is self.arr):
return True
return (self.arr == other.arr).all()
def __ne__(self, other):
return not (self == other)
>>> a = array([0, 1])
>>> b = array([1, 0])
>>> l = [ NArray(a), NArray(b) ]
>>> l.index(NArray(a))
0
>>> l.index(NArray(b))
1
。
在我的情况下,我有一个[System.Web.Mvc.AllowHtml]
类,在 MVC验证发生之前访问Request对象(因此AllowHtml没有效果),这个访问引发{{1} }。
这意味着,访问Request对象的某些属性会隐式触发验证(在我的例子中是UnhandledExceptionFilter
属性)。
要禁用请求中特定字段的请求验证(例如,对于输入元素或查询字符串值),请在获取项目时调用Request.Unvalidated方法,如以下示例所示
因此,如果你有这样的代码
[HttpRequestValidationException] A potentially dangerous Request.Form value was detected from the client
将其更改为
Params
或者只使用似乎不会激活验证的var lParams = aRequestContext.HttpContext.Request.Params;
if (lParams.Count > 0)
{
...
属性
var lUnvalidatedRequest = aRequestContext.HttpContext.Request.Unvalidated;
var lForm = lUnvalidatedRequest.Form;
if (lForm.Count > 0)
{
...
答案 5 :(得分:2)
如果您需要为动作方法参数(与“模型属性”相对)允许html输入,则没有内置方法可以做到这一点,但您可以使用自定义模型绑定器轻松实现此目的:
public ActionResult AddBlogPost(int userId,
[ModelBinder(typeof(AllowHtmlBinder))] string htmlBody)
{
//...
}
AllowHtmlBinder代码:
public class AllowHtmlBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var request = controllerContext.HttpContext.Request;
var name = bindingContext.ModelName;
return request.Unvalidated[name]; //magic happens here
}
}
在我的博文中找到完整的源代码和说明:https://www.jitbit.com/alexblog/273-aspnet-mvc-allowing-html-for-particular-action-parameters/
答案 6 :(得分:1)
我在使用NopCommerce开发电子商务网站时遇到了这个问题,我通过3种不同的方式得到了这个解决方案,就像之前的答案一样。但根据NopCommerce结构,我没有一次找到这三个。我刚刚看到他们只使用[AllowHtml]
并且除了任何问题之外它工作得很好。如前所述question
我个人不喜欢[ValidateInput(false)]
,因为我正在跳过总模型实体检查,这是不安全的。但如果有人只写have a look here
[AllowHtml]
public string BlogText {get;set;}
然后它只跳过单个属性,只允许特定属性并且几乎不检查所有其他实体。因此,它似乎比我的更好。
答案 7 :(得分:1)
在我的情况下,当与OutputCache操作过滤器结合使用时,AllowHtml属性不起作用。 This answer为我解决了这个问题。希望这有助于某人。
答案 8 :(得分:0)
URL编码数据对我来说也很好
例如
var data ='你好'
在发布前在浏览器中调用encodeURIComponent(data)
在服务器上调用HttpUtility.UrlDecode(received_data)进行解码
这样,您可以精确地控制允许哪些字段包含html
答案 9 :(得分:0)
例如,您可以在项目中使用[AllowHtml]
[AllowHtml]
public string Description { get; set; }
使用此代码对您安装此软件包的库进行分类
Install-Package Microsoft.AspNet.Mvc
使用此using
using System.Web.Mvc;
答案 10 :(得分:0)