2012-10-25 75 views
2

我正在使用Asp MVC 3應用程序。序列化枚舉爲常量JsonNet

我有一個枚舉:

public enum EmployeesOptions 
    { 
     John = 1, 
     Peter = 2, 
     Andrew = 3 
    } 

而一個MyViewModel

public class MyViewModel 
    { 
     public MyViewModel() 
     { 
      Employees = new List<EmployeesOptions>() 
      { 
       EmployeesOptions.John, 
       EmployeesOptions.Peter, 
       EmployeesOptions.Andrew 
      }; 
     } 

     public IEnumerable<EmployeesOptions> Employees { get; set; } 
    } 

我的控制器:

public ActionResult Index() 
     { 
      var vm = new MyViewModel(); 
      return View(vm); 
     } 

在我的索引視圖:

@model MyViewModel 

    <script type="text/javascript"> 
     var jsonString = '@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(this.Model))'; 

     var data = ko.mapping.fromJSON(jsonString); 
     omega.franchiseInfo = ko.mapping.fromJS(data); 
    </script> 

我的序列化的數據來自服務器看起來是這樣的:

Emplyees:[1,2,3] 

我想是這樣的:

Emplyees:["John","Peter","Andrew"] 

我缺少什麼?

更新:

var jsonString = '@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(this.Model, Newtonsoft.Json.Formatting.None, new Newtonsoft.Json.Converters.StringEnumConverter()))'; 

該做的工作!

+0

幫了我很多!感謝分享解決方案... –

回答

0

您正在返回枚舉,默認情況下它將顯示枚舉值。你可以像這樣修改你的模型。

public class MyViewModel 
{ 
    public MyViewModel() 
    { 
     Employees = new List<EmployeesOptions>() 
     { 
      EmployeesOptions.John.ToString(), 
      EmployeesOptions.Peter.ToString(), 
      EmployeesOptions.Andrew.ToString() 
     }; 
    } 

    public IEnumerable<EmployeesOptions> Employees { get; set; } 
} 

通過使用.ToString()擴展方法,我們可以枚舉轉換成他們所代表字符串格式確切的事情。

3

如果你想要這個枚舉類型總是與它的字符串值被序列化,您可以用JsonConverter屬性和StringEnumConverter類這樣裝飾一下:

using Newtonsoft.Json; 
using Newtonsoft.Json.Converters; 

[JsonConverter(typeof(StringEnumConverter))] 
public enum EmployeesOptions 
{ 
    John = 1, 
    Peter = 2, 
    Andrew = 3 
} 

那麼你不需要指定串行器選項中的任何轉換器類。

1

我試過裝飾List財產持有Enum值與[JsonConverter(typeof(StringEnumConverter))],但可以理解,沒有工作,因爲它應該直接裝點Enum類型。

// Did not work! 
[JsonConverter(typeof(StringEnumConverter))] 
public List<Assessment.AssessmentFunction> SelectedFunctions { get; set; } 

然後我做了如你所說,它的工作如預期。

var selectedFunctions = @Html.Raw(JsonConvert.SerializeObject(Model.SelectedFunctions, 
                   new StringEnumConverter())) 

相反的Enum INT值現在我得到一個Razor .cshtml視圖中的JavaScript代碼Enum字符串。正是我在特定情況下所需要的。

以前

var selectedFunctions = @Html.Raw(Json.Encode(Model.SelectedFunctions)) 

// Output 
var selectedFunctions = [3, 3, 2, 2, 2, 3, 2, 2] 

var selectedFunctions = @Html.Raw(JsonConvert.SerializeObject(Model.SelectedFunctions, 
                   new StringEnumConverter())) 

// Output 
var selectedFunctions = ["Nurse","Nurse","Doctor","Doctor","Doctor","Nurse","Doctor","Doctor"]