Voici une solution simple qui sérialise une énumération C # côté serveur en JSON et utilise le résultat pour remplir un côté client <select>
élément . Cela fonctionne pour les énumérations simples et les énumérations bitflag.
J'ai inclus la solution de bout en bout parce que je pense que la plupart des gens qui souhaitent sérialiser une énumération C # en JSON l'utiliseront probablement aussi pour remplir une liste <select>
déroulante.
Voici:
Exemple d'énumération
public enum Role
{
None = Permission.None,
Guest = Permission.Browse,
Reader = Permission.Browse| Permission.Help ,
Manager = Permission.Browse | Permission.Help | Permission.Customise
}
Une énumération complexe qui utilise des OR au niveau du bit pour générer un système d'autorisations. Vous ne pouvez donc pas vous fier à l'index simple [0,1,2 ..] pour la valeur entière de l'énumération.
Côté serveur - C #
Get["/roles"] = _ =>
{
var type = typeof(Role);
var data = Enum
.GetNames(type)
.Select(name => new
{
Id = (int)Enum.Parse(type, name),
Name = name
})
.ToArray();
return Response.AsJson(data);
};
Le code ci-dessus utilise le framework NancyFX pour gérer la demande Get. Il utilise la Response.AsJson()
méthode d'assistance de Nancy - mais ne vous inquiétez pas, vous pouvez utiliser n'importe quel formateur JSON standard car l'énumération a déjà été projetée dans un type anonyme simple prêt pour la sérialisation.
JSON généré
[
{"Id":0,"Name":"None"},
{"Id":2097155,"Name":"Guest"},
{"Id":2916367,"Name":"Reader"},
{"Id":4186095,"Name":"Manager"}
]
Côté client - CoffeeScript
fillSelect=(id, url, selectedValue=0)->
$select = $ id
$option = (item)-> $ "<option/>",
{
value:"#{item.Id}"
html:"#{item.Name}"
selected:"selected" if item.Id is selectedValue
}
$.getJSON(url).done (data)->$option(item).appendTo $select for item in data
$ ->
fillSelect "#role", "/roles", 2916367
HTML avant
<select id="role" name="role"></select>
HTML après
<select id="role" name="role">
<option value="0">None</option>
<option value="2097155">Guest</option>
<option value="2916367" selected="selected">Reader</option>
<option value="4186095">Manager</option>
</select>