我使用的是Asp MVC 3应用程序。
我有一个Enum:
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 :(得分:3)
如果您希望此枚举类型始终使用其字符串值进行序列化,则可以使用JsonConverter
属性和StringEnumConverter
类对其进行装饰:
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
[JsonConverter(typeof(StringEnumConverter))]
public enum EmployeesOptions
{
John = 1,
Peter = 2,
Andrew = 3
}
然后您不再需要在序列化程序选项中指定任何转换器类。
答案 1 :(得分: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
.cshtml视图中的JavaScript代码中获得了Enum
个字符串,而不是Razor
int值。正是我在特定情况下所需要的。
<强>之前强>
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"]
答案 2 :(得分: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()
扩展方法,我们可以将枚举转换为它们表示为字符串格式的确切内容。