使用挖空将 HTML 字符串传递给 C# 控制器.我做错了什么
本文关键字:控制器 什么 错了 字符串 HTML | 更新日期: 2023-09-27 18:34:53
>好吧。我可以从页面中获取我需要的 HTML(它们都在 DIV 中(。这不是问题所在。我需要做的是获取 HTML 并通过 C# 类将其传递到控制器中。
我尝试用 knockout/jQuery 做这样的事情:
var Details = $("#Details").html();
console.log(Details);
DetailsPdf.DetailsMarkup = JSON.stringify(Details);
var jsonData = ko.toJS(Details);
ko.utils.postJson("/MyController/MyAction", DetailsPdf);
淘汰赛实际上确实让我获得了相关的 HTML。但是当我把它传递给我的类时,我得到一个异常,内容如下:
从客户端检测到具有潜在危险的 Request.Form 值。
然后它部分显示我作为异常的一部分发送的 HTML。我什至无法在没有出现异常的情况下传入实体本身。
这是一个具有某些公司强制安全功能的应用程序,因此无法关闭验证。
我需要 HTML,或者至少是一种在 C# 的服务器上重新创建它的方法。
我对淘汰赛还是比较陌生的。有人在这里有什么建议吗?
你应该提到:
这是一个具有某些公司规定的安全功能的应用程序,因此 关闭验证不是一种选择。
在您最近的问题中使用iTextSharp与淘汰JavaScript框架中?我本可以在那里提供这个答案。
我不确定为什么用[ValidateInput(false)]
装饰控制器 Action 不起作用,但该答案的完全有效的源代码是可用的。无论出于何种原因,您只需要进行一些更改即可解决此问题:
(1( Base64 在 JavaScript 中对 HTML 进行编码:
ko.utils.postJson("/MyController/MyAction", window.btoa(DetailsPdf));
(2( 解码 MVC 控制器中的字符串:
[HttpPost]
public ActionResult Index(string xHtml)
{
xHtml = Encoding.UTF8.GetString(Convert.FromBase64String(xHtml));
(3( 使用 Json.Net
或其他将该字符串反序列化为模型/实体。
上述步骤也已经过测试和验证,工作正常。 ;)
能够在具有 HTML 的属性上使用 [AllowHtml]
属性修饰模型(控制器操作所期望的模型(。
执行此操作时,MVC 将跳过该属性的验证。
下面是指向文档的链接,以获取更多信息。
注意 仅在需要时使用此选项。如果误用,它确实会打开 XSS 的向量。
编辑:如果由于某种原因,您无法使用 [AllowHtml]
属性,则可以关闭使用 [ValidateInput(false)]
验证该操作的请求。
同样的规则适用。非常谨慎地使用它。这意味着不会仅在该特定操作中针对该特定模型运行任何安全验证。