2016-11-03 1 views
2

На моей стороне клиента я имею Ajax вызов, как показано ниже:JsonResults возвращает значение Enum вместо представления Струнного

  $.ajax({ 
       url: "Controller/ListResult", 
       type: 'POST', 
       contentType: "application/json;charset=utf-8", 
       data: JSON.stringify({ 
        Id: ObjectId, 
        SessionKey: sessionManager.getSessionKey() 
       }), 
       dataType: "json", 
       success: function (result) { 
       var test = results; 
        } 
       } 
      }); 

В контроллере у меня есть метод, как это:

 [HttpPost] 
     public JsonResult ListResult(string Id, string SessionKey) 
     { 
     IBl biz = new BL(); 
     var result = biz.GetResults(Id,SessionKey); 
     return Json(result); 
     } 

Проблема заключается в том, что результат, который возвращает контроллер - это объект, который имеет несколько объектов Enum (с их строковым представлением как значение) , Однако, когда он достигает успехаФункция в вызове ajax, перечисления больше не являются строковым представлением, и вместо этого они каким-то образом были преобразованы в их значения int. Как я могу избежать этого? и сохраните строковое представление на стороне javascript.

+0

Что такое 'sessionManager.getSessionKey()'? –

+0

@StephenMuecke, это внутренняя функция для извлечения сеанса, но это ничего не должно влиять. Потому что он работает так, как ожидалось. – Benjamin

+4

Вам нужно будет создать анонимный объект для представления ваших данных и использовать 'ToString()' для свойств перечисления ('JavascriptSerializer' сериализует перечисления на их числовые значения, а не их строковое представление) –

ответ

4

Вместо возвращении var result создать некоторый результат сущности класса, и вы можете отметить свойство перечислимого там с StringEnumConverter.

class Result 
{ 
    [JsonConverter(typeof(StringEnumConverter))] 
    public EnumType EnumProperty { get; set; } 

    *****other properties goes here**** 
} 

Как Стивен предложил это работает, если используется Json.NET как сериализатором.

+0

Только если OP использует Json.NET в качестве сериализатора :) –

+0

Вы правы, я обновил. –

3

попробовать что-то вроде этого:

var result = biz.GetResults(Id,SessionKey); 
    var modifiedResult = new 
     { 
     ..., 
     r.EnumValue.ToString(), 
     ... 
     }; 
    return Json(modifiedResult); 
+0

Как я уже сказал, результат в Контроллере уже является строковым представлением, и нет необходимости ToString(). Он просто преобразуется в значение int, когда он достигает стороны Javascript. – Benjamin

+0

Если свойства в результате, возвращаемые контроллером, являются Enums, вызов 'return Json (result)' будет преобразовывать эти строки обратно в их целочисленные значения. Если вы сначала проецируете результат в анонимный тип, тогда свойства будут просто строками. –

+1

Почти правильно - но вы не можете использовать '.Select()' на одном объекте (что OP указывает, что метод 'GetResults()' возвращает –

Смежные вопросы