所以我对这一点感到有点难过.我有多个页面使用各种数据对后端的C#控制器进行了大量成功的Ajax调用,但现在我正在尝试构建一个简单的小内容管理功能,因此在数据库中更新
HTML来自JS编辑器的新
HTML.
长话短说,我已经取出了所有繁重的数据库代码并将其缩小到我的控制器不接受任何带有html标签的事实,或者我的ajax代码在发送它时遇到问题.
Ajax函数是:
$.ajax({ type: "POST",url: '@Url.Action("UpdateContent","Admin")',data: { elementId: elementId,newContent: newContent },dataType: "json",success: function (data) { if (data.result == 'true') { infoMessage('Content Updated!','success'); } else { infoMessage('Error: ' + data.result + '. nothing has been updated!','error'); } },error: function () { alert('There was a problem contacting the server.'); } });
在我的控制器端,我已经拿走了所有代码,只留下一些调试写行.
[HttpPost] public ActionResult UpdateContent(string elementId,string newContent) { System.Diagnostics.Debug.WriteLine("!" + elementId); System.Diagnostics.Debug.WriteLine("!" + newContent); string _result = "true"; return Json(new { result = _result }); }
现在有趣的是,当我在Ajax请求中的数据参数中设置newContent时,设置为< p> hello< / p>那些writelines甚至没有被调用,整个ajax调用失败.然而,当我只使用普通的字符串,例如你好,它工作正常.我进一步将其缩小到只是开头的html括号,所以即使< p也会失败. 考虑到这一点,这里发生了什么?其次,通过Ajax将html发送回控制器的正确方法是什么,所以这不会发生?
解决方法
默认情况下,ASP.NET已启用
request validation以帮助防止XSS.您可以通过向操作添加ValidateInput属性来禁用此功能:
[HttpPost] [ValidateInput(false)] public ActionResult UpdateContent(string elementId,string newContent) { System.Diagnostics.Debug.WriteLine("!" + elementId); System.Diagnostics.Debug.WriteLine("!" + newContent); string _result = "true"; return Json(new { result = _result }); }
<httpRuntime requestValidationMode="2.0" />
更新(更好)的替代方法是使用AllowHtml属性,该属性将应用于模型上的属性.这是首选,因为您只允许此道具绕过验证而不是整个请求.
class MyModel { [AllowHtml] public string MyHtml { get; set; } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。