【问题标题】:Numbered special characters not being sent correctly by jquery ajaxjquery ajax未正确发送编号的特殊字符
【发布时间】:2013-05-15 19:09:57
【问题描述】:

我看过几篇关于绕过未正确传输的特殊字符的不同方法的帖子。但是,我想要一个更好、更简单的解决方案(可能找不到)。

我也有一个传递对象的函数。在对象(myObject)中,可以有一些带有特殊编号字符的文本(Bill’s,右单引号特殊编号字符)。

当我尝试发送数据时,它会阻塞。所以,然后我检查了我的代码,并在它接受用户输入的所有地方都进行了转义,并且在显示信息的地方没有转义。

问题:

  • 可能缺少显示或接受用户输入的位置。
  • 数据与转义字符一起存储。

我已经看到了特殊字符被清理的解决方案,但它需要一个特殊字符列表。或者我可以尝试解码后端的转义字符。

  • 后端 - MVC .net C#
  • jQuery 版本:1.7.2

    var json = $.toJSON(myObject);
    
    $.ajax({
        type: 'POST',
        url: RootUrl + "Viewer/Save/",
        data: { "json": json },
        async: false,
        contentType: "application/json; charset=utf-8",
        success: function (data) {
            var $("#display").(data);
        },
        error: function (xhr, status, error) {
            alert(error);
        }
    });
    

更多信息:

json 字符串被传递给 MVC 控制器。方法如下所示。

public ContentResult Save(string json)
{
    try
    {
        dynamic data = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<dynamic>(json);
    }
    catch (Excepteion ex)
    {
         // More code
    }
}

我在 Chrome 调试器中收到的错误消息是:

  • 500(内部服务器错误)

我想多了,我想知道后端是否有一个设置需要更改以接受特殊编号的字符。我之所以这么说是因为如果我在 MVC 控制器方法的开头设置一个断点,它实际上永远不会到达断点。但是如果转义或者使用撇号就可以了。

我将继续搜索并回复我的发现。

更新

关注信息:Getting "A potentially dangerous Request.Path value was detected from the client (&)"

    [ValidateInput(false)]
    [HttpPost]
    public ContentResult SaveTailoring(string json)

我将此添加到我的代码中,它解决了我将数据输入控制器的问题。我很乐意进行更多研究,并希望对这种技术的利弊有任何想法。

【问题讨论】:

  • 代码的哪一部分应该对&amp;#8217; 之类的符号做一些事情(不能包含空格——问题中的那个)?因此,在序列化 HTML 之外,&amp;#8217; 只是七个 Ascii 字符。此外,如果您发布的数据希望以 UTF-8 格式传输,就像代码一样,您为什么要考虑转义字符?
  • 不,它不包含空格。是的,它可以序列化,但是当我在 MVC 控制器中收到它时,我得到一个错误 500,内部服务器错误。昨晚我在考虑这个问题,想知道这个问题是否更多地出现在后端,不确定。
  • 你试过ApiController吗?我不是 MVC 专家,但我发现在构建我的 jQuery ajax 方法时使用它们更容易,为页面/部分保持正常的Controllers。发布 UTF-8 我没想到需要任何特殊的转义,但我没有尝试过。
  • 让我对此进行一些研究。我正在寻找一个问题最少的好解决方案。

标签: c# jquery ajax asp.net-mvc-4 special-characters


【解决方案1】:

如果你想用 ApiController 来试试这个,假设你的服务器代码中有一个名为 myObject 的类,并且在 JavaScript 中有一个匹配的表示,这个

public ContentResult Save(string json)
{
    try
    {
        dynamic data = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<dynamic>(json);
    }
    catch (Excepteion ex)
    {
         // More code
    }
}

会变得更像这样,让您可以合理无缝地使用原生类型

public class myObjectController : ApiController
{
    // ... code for GET/PUT/DELETE versions omitted ...

    // POST api/myObject
    public myObject PostmyObject(myObject myObject)
    {
        // code to save and update myObject
        return myObject;
    }
}

虽然自动创建的 REST 方法通常会为 POSTs 返回一个 HttpResponseMessage,它有一个状态和一个标头,提供指向新保存对象的获取链接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多