每当发送的文本包含"<"时,都不会从 $.ajax POST 调用操作方法



我正在使用以下内容在我的intranet站点上显示一些文本:

@Html.TextAreaFor(model => model.Text)

现在,文本可能包含一些类似XML的格式,当我在表单提交上尝试以下操作时,这似乎会带来问题:

$("form").on("submit", function () {
var model = $(this).serialize();
$.ajax({
url: "/Test/Foo",
type: "POST",
data: model,
dataType: "json",
success: doSomething(response)
});
return false;
});

action方法采用一个POCO作为我提交的表单的站点模型,并返回一些JsonResult

只要<textarea>中的文本是"正常"文本,就没有问题,并且我正确地输入了操作方法,并且我的POCO具有正确的属性值。但是,一旦我将文本<foo>(带大括号)输入到<textarea>中,我的操作方法就不再受影响了。

我尝试使用$(this).serializeArray(),但它也不起作用。serialize()serializeArray()方法甚至替换了"<"one_answers">"符号(还有"=";首先我认为这是造成问题的原因),所以我猜它们在内部使用escape(),但没有发送任何内容。

当我手动作为data发送时

{
Text: escape($("#myTextArea").val()),
Description: $("#someInput").val(),
Id: $("input[type=hidden]").val()
}

它是有效的,也就是说,我输入了我的操作方法,但当然我有一个格式奇怪的字符串要在服务器上使用。

这里到底出了什么问题?有些编码问题?我是否必须以其他方式序列化以避免这个问题?

这是ASP.Net MVC的一个安全特性。默认情况下,当它在接收到的值中检测到HTML时,它将阻止执行,以防它是XSS攻击的一部分。

要在操作上禁用此功能,需要使用ValidateInput属性并将其设置为false。试试这个:

[ValidateInput(false)]
public ActionResult Foo(Model myModel) 
{
// your logic here...
}

您也可以使用AllowHtml属性在模型属性级别禁用此功能:

public class MyModel {
public Guid Id { get; set; }
[AllowHtml]
public String Description { get; set; }
}

最新更新