只要发送的文本包含“<”,就不会从 $.ajax POST 调用操作方法
Action method is not called from $.ajax POST whenever the sent text contains "<"
我正在使用以下内容在我的内部网站上显示一些文本:
@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 作为站点的模型,其中包含我提交的表单和 returns 一些 JsonResult
.
只要<textarea>
中的文本是"normal"文本,就没有问题,我正确输入了操作方法并且我的POCO具有正确的属性值。但是,一旦我将文本 <foo>
(带大括号)输入到 <textarea>
中,我的操作方法就不再命中了。
我尝试使用 $(this).serializeArray()
代替,但它也不起作用。 serialize()
和 serializeArray()
方法甚至替换了“<”和“>”符号(还有“=”;起初我认为这是导致问题的原因),所以我猜他们在内部使用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; }
}
我正在使用以下内容在我的内部网站上显示一些文本:
@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 作为站点的模型,其中包含我提交的表单和 returns 一些 JsonResult
.
只要<textarea>
中的文本是"normal"文本,就没有问题,我正确输入了操作方法并且我的POCO具有正确的属性值。但是,一旦我将文本 <foo>
(带大括号)输入到 <textarea>
中,我的操作方法就不再命中了。
我尝试使用 $(this).serializeArray()
代替,但它也不起作用。 serialize()
和 serializeArray()
方法甚至替换了“<”和“>”符号(还有“=”;起初我认为这是导致问题的原因),所以我猜他们在内部使用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; }
}