在为asp隐藏字段赋值时,转义符号被清除

时间:2015-08-10 10:25:37

标签: javascript c# json string

我正在关注一个奇怪的问题。以下是详细说明

  1. 我的JSON字符串对象

    public class ChartSearchCriteria
    {
    public ChartSearchCriteria()
    {
    
    }
    public DateTime StartDate
    {
        get;
        set;
    }
    public DateTime EndDate
    {
        get;
        set;
    }
    public Int32 ClassType
    {
        get;
        set;
    }
    public Int32 InstructorID
    {
        get;
        set;
    }            
    }
    
  2. 我正在将此对象转换为JSON字符串并分配给一个隐藏字段

     ChartSearchCriteria objChartSearchCriteria = new ChartSearchCriteria()
        {
            StartDate = startDate,
            EndDate = endDate,
            ClassType = Convert.ToInt32(ddlClassType.SelectedValue)
        };
        string jsonSearchCriteria = new JavaScriptSerializer().Serialize(objChartSearchCriteria);
    
        // Here in jsonSearchCriteria i am getting following string
        // "{\"StartDate\":\"\\/Date(1436466600000)\\/\",\"EndDate\":\"\\/Date(1439145000000)\\/\",\"ClassType\":0,\"InstructorID\":0}"
        hdnSearchData.Value = jsonSearchCriteria;
    
  3. 我想将此json字符串传递给另一个带有查询字符串的页面。我使用了以下javascript来获取网址

    alert(document.getElementById("hdnSearchData").value);
    // Here i am getting following JSON string from hidden field
    // {"StartDate":"\/Date(1436466600000)\/","EndDate":"\/Date(1439145000000)\/","ClassType":0,"InstructorID":0}
    var searchData = JSON.parse(document.getElementById("hdnSearchData").value);    
    var redirectUrl = _spPageContextInfo.webAbsoluteUrl + "/_layouts/15/DetailedChart.aspx?searchdata=" + encodeURIComponen(JSON.stringify(searchData));
    
  4. 现在我使用以下代码将json字符串反序列化为对象到另一个页面,我已将该json字符串作为查询字符串传递

        string jsonString = Convert.ToString(Page.Request.QueryString["searchdata"]);
        jsonString = HttpUtility.UrlDecode(jsonString);
        // Here I am getting following json string
        // {"StartDate":"\/Date(1436466600000)\/","EndDate":"\/Date(1439145000000)\/","ClassType":0,"InstructorID":0}
        JavaScriptSerializer oJS = new JavaScriptSerializer();
        ChartSearchCriteria oRootObject = new ChartSearchCriteria();
        oRootObject = oJS.Deserialize<ChartSearchCriteria>(jsonString);
    
  5. 所以我在这里得到例外:

      

    “日期(234234000)”无法转换为将json字符串反序列化为对象时的日期时间

    我得到的唯一一件事是,在将json字符串分配给隐藏字段时,它正在从json中丢失转义字符。

    从服务器端创建的JSON字符串:

      

    {\ “开始日期\”:\ “\ /日期(1436466600000)\ / \”,\ “结束日期\”:\ “\ /日期(14391.45亿)\ / \”,\ “类类别\”:0, \ “InstructorID \”:0}“

    使用javascript从客户端获取JSON字符串:

      

    { “开始日期”: “/日期(1436466600000)/”, “结束日期”: “/日期(14391.45亿)/”, “类类别”:0 “InstructorID”:0}

    因此,您可以在上面看到将json字符串分配给隐藏字段时显示的不同字符串,它正在删除转义字符,这就是为什么我无法将其转换回对象到另一个页面的原因。

    我确信100%它是与转义字符相关的问题,因为我已经使用以下字符串检查了反序列化方法并且它工作正常

      

    {\ “开始日期\”:\ “\ /日期(1436466600000)\ / \”,\ “结束日期\”:\ “\ /日期(14391.45亿)\ / \”,\ “类类别\”:0, \ “InstructorID \”:0}“

    那么我该如何解决这个问题呢?我的最终目标是将json字符串传递给另一个页面并反序列化为同一个对象。

    任何帮助都将受到高度赞赏,让我知道有人想要更多信息。

1 个答案:

答案 0 :(得分:0)

我已使用以下代码解决了问题。

 string jsonString = Convert.ToString(Page.Request.QueryString["searchdata"]);
jsonString = HttpUtility.UrlDecode(jsonString);
// Here I am getting following json string
// {"StartDate":"\/Date(1436466600000)\/","EndDate":"\/Date(1439145000000)\/","ClassType":0,"InstructorID":0}
// By using following line I have corrected json string and now it is being deserialized to object.
jsonString = jsonString.Replace("/", "\\/");
JavaScriptSerializer oJS = new JavaScriptSerializer();
ChartSearchCriteria oRootObject = new ChartSearchCriteria();
oRootObject = oJS.Deserialize<ChartSearchCriteria>(jsonString);