我正在从管理员的html编辑器向服务器控制器发布一些标记,如下所示:
var dataString = 'id=' + id +
'&name=' + name +
'&nameEngl=' + nameEngl +
'&description=' + description +
'&descriptionEngl=' + descriptionEngl +
'&imageName=' + imageName +
'&previewImageName=' + previewImageName +
'&types=' + types +
'&bottomAreaHtml=' + bottomAreaHtml +
'&bottomAreaHtmlEngl=' + bottomAreaHtmlEngl +
'&slug=' + slug +
'&__RequestVerificationToken=' + encodeURIComponent($("input[name=__RequestVerificationToken]").val());
$.ajax({
type: "POST",
url: $("#EditProjectActionUrl").val(),
data: dataString,
success: function (result) {
RefreshProjectsList();
form.find("#divStatus-p").hide();
form.closest('.modal-popup').dialog('close');
}
});
正如您所看到的,dataString
是一个带有标记的大字符串,但是,我通过浏览器请求看到正在正确发布到服务器的遥测。
在服务器上,我通过控制器的操作收到发布的数据:
[Authorize]
[ValidateAntiForgeryToken]
[ValidateInput(false)]
[HttpPost]
public ActionResult EditProject(string id, string name, string nameEngl, string description, string descriptionEngl, string customCSS, string imageName, string previewImageName, string types, string bottomAreaHtml, string bottomAreaHtmlEngl, string slug)
{
在方法调用时,默认绑定器会填充所有参数。 bottomAreaHtml
参数包含剪切(非完整)标记字符串的问题。这有什么问题?
答案 0 :(得分:1)
我建议采用不同的方法。不要在EditProject
操作中包含这么多参数,而是创建一个具有与这些参数匹配的属性的对象。例如:
public class ProjectSettings
{
public string id { get; set; }
public string name { get; set; }
public string nameEngl{ get; set; }
public string description{ get; set; }
public string descriptionEngl{ get; set; }
public string customCSS{ get; set; }
public string imageName{ get; set; }
public string previewImageName{ get; set; }
public string types{ get; set; }
public string bottomAreaHtml{ get; set; }
public string bottomAreaHtmlEngl{ get; set; }
public string slug{ get; set; }
}
然后,您可以将对象本身传递给动作,模型绑定器将为您完成繁重的工作。
[Authorize]
[ValidateAntiForgeryToken]
[ValidateInput(false)]
[HttpPost]
public ActionResult EditProject(ProjectSettings projectSettings)
{
//...
}
您的JavaScript也可以使用对象!
var settings = {
'id': id,
'name': name,
'nameEngl': nameEngl,
'description': description,
'descriptionEngl': descriptionEngl,
'imageName': imageName,
'previewImageName': previewImageName,
'types': types,
'bottomAreaHtml': bottomAreaHtml,
'bottomAreaHtmlEngl': bottomAreaHtmlEngl,
'slug': slug
};
$.ajax({
type: "POST",
url: $("#EditProjectActionUrl").val(),
data: { projectSettings: settings, '__RequestVerificationToken': encodeURIComponent($("input[name=__RequestVerificationToken]").val()) },
contentType: 'application/json, charset=utf-8',
success: function (result) {
RefreshProjectsList();
form.find("#divStatus-p").hide();
form.closest('.modal-popup').dialog('close');
}
});
坦率地说,我不太确定防伪令牌是如何进入的,但我认为你明白了。这样你就不会对抗JavaScript和字符串连接。
祝你好运。
答案 1 :(得分:0)
如果我只使用javascript对象作为数据参数而不是将数据编码为查询字符串形式,则数据不会被分层并且通常会传递到服务器。
答案 2 :(得分:0)
你应该确保bottomAreaHtml不包含'&'焦炭。 如果确实如此,并且你没有逃避它,它将“混淆”模型绑定器 - 因为它是查询字符串值的分隔符