Đây là một giải pháp đơn giản để tuần tự hóa C # enum phía máy chủ thành JSON và sử dụng kết quả để đưa vào <select>
phần tử phía máy khách . Điều này làm việc cho cả enums đơn giản và enum bitflag.
Tôi đã đưa vào giải pháp đầu cuối bởi vì tôi nghĩ rằng hầu hết mọi người muốn tuần tự hóa C # enum thành JSON cũng có thể sẽ sử dụng nó để điền vào phần <select>
thả xuống.
Đây là:
Ví dụ Enum
public enum Role
{
None = Permission.None,
Guest = Permission.Browse,
Reader = Permission.Browse| Permission.Help ,
Manager = Permission.Browse | Permission.Help | Permission.Customise
}
Một enum phức tạp sử dụng OR bitwise để tạo ra một hệ thống quyền. Vì vậy, bạn không thể dựa vào chỉ mục đơn giản [0,1,2 ..] cho giá trị nguyên của enum.
Phía máy chủ - 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);
};
Đoạn mã trên sử dụng khung NancyFX để xử lý yêu cầu Nhận. Nó sử dụng Response.AsJson()
phương thức trợ giúp của Nancy - nhưng đừng lo lắng, bạn có thể sử dụng bất kỳ trình định dạng JSON tiêu chuẩn nào vì enum đã được chiếu thành một loại ẩn danh đơn giản sẵn sàng để tuần tự hóa.
Đã tạo JSON
[
{"Id":0,"Name":"None"},
{"Id":2097155,"Name":"Guest"},
{"Id":2916367,"Name":"Reader"},
{"Id":4186095,"Name":"Manager"}
]
Phía khách hàng - 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 trước
<select id="role" name="role"></select>
HTML sau
<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>