Aquí hay una solución simple que serializa una enumeración de C # del lado del servidor a JSON y utiliza el resultado para completar un <select>
elemento del lado del cliente . Esto funciona tanto para enumeraciones simples como para enumeraciones de bitflag.
He incluido la solución de extremo a extremo porque creo que la mayoría de las personas que desean serializar una enumeración de C # a JSON probablemente también la usarán para completar un <select>
menú desplegable.
Aquí va:
Ejemplo de enumeración
public enum Role
{
None = Permission.None,
Guest = Permission.Browse,
Reader = Permission.Browse| Permission.Help ,
Manager = Permission.Browse | Permission.Help | Permission.Customise
}
Una enumeración compleja que utiliza OR bit a bit para generar un sistema de permisos. Por lo tanto, no puede confiar en el índice simple [0,1,2 ..] para el valor entero de la enumeración.
Lado del servidor - 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);
};
El código anterior usa el marco NancyFX para manejar la solicitud Get. Utiliza el Response.AsJson()
método auxiliar de Nancy, pero no se preocupe, puede usar cualquier formateador JSON estándar ya que la enumeración ya se ha proyectado en un tipo anónimo simple listo para la serialización.
JSON generado
[
{"Id":0,"Name":"None"},
{"Id":2097155,"Name":"Guest"},
{"Id":2916367,"Name":"Reader"},
{"Id":4186095,"Name":"Manager"}
]
Lado del cliente - 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 antes
<select id="role" name="role"></select>
HTML despué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>