122

如何允许用户使用 ASP.net MVC 将 HTML 输入到特定字段中。

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

我想让一个字段(描述)允许 HTML,我将在以后执行我自己的卫生处理。

4

11 回答 11

165

在要允许 HTML 的控制器中添加以下属性作为操作(发布):

[ValidateInput(false)] 

编辑:根据Charlino评论:

在您的 web.config 中设置使用的验证模式。见MSDN

<httpRuntime requestValidationMode="2.0" />

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

您现在应该使用该[AllowHtml]属性。请参阅下面的MSDN

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

public class BlogEntry {
    public int UserId {get;set;}
    [AllowHtml] 
    public string BlogText {get;set;}
 }
于 2010-09-01T19:11:11.760 回答
131

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

于 2012-07-30T12:17:20.357 回答
42

添加到模型:

using System.Web.Mvc;

和你的财产

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

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

于 2013-03-24T21:05:23.197 回答
9

添加[AllowHtml]特定属性是推荐的解决方案,因为有很多博客和评论建议降低安全级别,这应该是不可接受的。

通过添加它,MVC 框架将允许访问控制器并执行该控制器中的代码。

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

无论如何,添加[AllowHtml]属性是正确的答案,因为它允许在控制器中反序列化 html。您的视图模型中的示例:

[AllowHtml]
public string MessageWithHtml {get; set;}
于 2015-05-06T22:19:02.650 回答
8

尽管我添加[System.Web.Mvc.AllowHtml]了一些答案中描述的相关属性,但我遇到了同样的问题。

在我的例子中,我有一个UnhandledExceptionFilter类在MVC 验证发生之前[HttpRequestValidationException] A potentially dangerous Request.Form value was detected from the client访问 Request 对象(因此 AllowHtml 没有效果)并且这种访问引发了.

这意味着,访问 Request 对象的某些属性会隐式触发验证(在我的情况下是Params属性)。

MSDN上记录了防止验证的解决方案

要禁用请求中特定字段的请求验证(例如,对于输入元素或查询字符串值),请在获取项目时调用 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)
{
  ...

或者只使用Form似乎不会触发验证的属性

var lForm = aRequestContext.HttpContext.Request.Form;
if (lForm.Count > 0)
{
  ...
于 2015-11-24T09:48:08.670 回答
3

URL 编码数据也适用于我

例如

var data = '<b>你好</b>'

在发布前在浏览器中调用 encodeURIComponent(data)

在服务器上调用 HttpUtility.UrlDecode(received_data) 进行解码

这样您就可以准确控制哪些字段区域允许拥有 html

于 2018-08-20T23:57:52.297 回答
3

如果您需要允许 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/

于 2018-06-11T11:27:44.570 回答
1

就我而言,AllowHtml 属性在与 OutputCache 操作过滤器结合使用时不起作用。这个答案为我解决了这个问题。希望这可以帮助某人。

于 2017-02-17T21:32:36.143 回答
1

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

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

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

然后它只跳过单个属性,只允许特定属性并且几乎不检查所有其他实体。因此,它似乎更适合我的。

于 2017-01-12T06:45:39.390 回答
1

您可以将其用于[AllowHtml]您的项目,例如

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

为了将此代码用于类库,您安装此包

Install-Package Microsoft.AspNet.Mvc

使用后using

using System.Web.Mvc;
于 2019-12-02T12:34:00.133 回答
0

不幸的是,这里没有一个答案对我有用。

我最终使用了自定义模型绑定并使用了第三方消毒剂。

在此处查看我的自我回答问题。

于 2019-12-26T02:35:25.233 回答