AllowHtml适用于Create但不适用于编辑ASP.Net MVC 5

时间:2016-09-05 12:22:33

标签: c# html asp.net asp.net-mvc validation

这是ASP.Net MVC 5项目

我有一个简单的模型,其中一个属性允许HTML输入:

public class FooModel {
    //other properties

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

使用该模型的控制器如下所示:

[OutputCache(NoStore = true, Duration = 0, Location = OutputCacheLocation.None)]
public class FooController : Controller {
    //some other codes...

    // GET: Foo/Create
    public ActionResult Create(int? id, int number = 0) {
      //some code
    }

    // POST: Foo/Create
    [HttpPost]
    public ActionResult Create(FooModel fooModel) {
        //some code
    }

    // GET: Foo/Edit/5
    public ActionResult Edit(int? id, int number = 0) {
        //some code
    }

    // POST: Foo/Edit/5
    [HttpPost]
    public ActionResult Edit(FooModel model, FormCollection collection) {
        //some code
    }
}

阅读SO中的一些帖子:

  1. AllowHtml attribute not working
  2. AllowHtml attribute doesn't work
  3. AllowHtml not working
  4. 我知道必须执行以下操作才能确保AllowHtml属性起作用:

    1. 在web.config中使用<httpRuntime requestValidationMode="2.0" />
    2. 清除模型传递和使用的控制器的缓存[OutputCache(NoStore = true, Duration = 0, Location = OutputCacheLocation.None)]
    3. 因此,我在web.config中有<system.web>的完整元素:

        <system.web>
          <authentication mode="None" />
          <compilation debug="true" targetFramework="4.6" />
          <httpRuntime targetFramework="4.5" requestValidationMode="2.0" />
          <httpModules>
            <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" />
          </httpModules>
        </system.web>
      

      而且,正如您所看到的,我还将OutputCache属性放在控制器之上:

      [OutputCache(NoStore = true, Duration = 0, Location = OutputCacheLocation.None)]
      

      现在,这对Create Action非常有效(也就是说,我可以在BarField中插入HTML元素,并且接受帖子并且可以毫无问题地调用Action)。

      但是当我执行Edit动作时,甚至没有调用动作并且错误:

        

      从客户端检测到一个潜在危险的Request.Form值(BarField =&#34; ...这里的字词&lt; i&gt;以及此处&lt; / i&gt;&lt; ...&#34;)。< / p>      

      描述:ASP.NET检测到请求中存在潜在危险的数据,因为它可能包含HTML标记或脚本。数据可能表示试图破坏应用程序的安全性,例如跨站点脚本攻击。如果此类输入适用于您的应用程序,则可以在网页中包含代码以明确允许它。有关更多信息,请参阅http://go.microsoft.com/fwlink/?LinkID=212874

      显示在页面上。为什么会这样?

1 个答案:

答案 0 :(得分:1)

抛出异常是因为您在FormCollection collection方法中包含了其他参数Edit()

当您应用[AllowHtml]属性时,它会将属性RequestValidationEnabled的{​​{1}}属性设置为ModelMetadata。在模型绑定过程中,false检查此值,因为它的DefaultModelBinder,绑定到模型时不会抛出异常。

但是,false只是FormCollection,并且通过阅读NameValueCollection值进行填充。没有模型和关联的元数据,因此抛出异常。如果您使用

,则会发生完全相同的情况
Request.Form

虽然使用var barField= Request["BarField"]; 的{​​{1}}属性可以正常工作

Unvalidated

您也可以通过将Request属性应用于该方法来使其工作,但这将适用于整个模型,并且是禁用请求验证的最不安全的方法。

删除var barField = Request.Unvalidated.Form["BarField"]; 方法中的[ValidateInput(false)]参数将解决问题,在任何情况下,都没有理由在MVC中使用FormCollection collection(您应该始终绑定到模特)。