您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

LuOrderByBinder.cs 2.9KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using System.Collections.Generic;
  2. using System.Threading.Tasks;
  3. using Microsoft.AspNetCore.Mvc.ModelBinding;
  4. namespace Luticate2.Utils.Dbo.OrderBy
  5. {
  6. public class LuOrderByBinder : IModelBinder
  7. {
  8. public static LuResult<LuOrderByDbo> FromString(string data)
  9. {
  10. if (data == null)
  11. {
  12. data = "";
  13. }
  14. data = data.Trim();
  15. var dbo = new LuOrderByDbo {Fields = new List<LuOrderByFieldDbo>()};
  16. if (data != "")
  17. {
  18. var fields = data.Split(',');
  19. foreach (var field in fields)
  20. {
  21. if (field == "")
  22. {
  23. return LuResult<LuOrderByDbo>.Error(LuStatus.InputError,
  24. string.Format("LuOrderByBinder: {0}", data), "Empty order by field");
  25. }
  26. var value = new LuOrderByFieldDbo();
  27. var split = field.Split(':');
  28. if (split.Length > 2 || split.Length == 0)
  29. {
  30. return LuResult<LuOrderByDbo>.Error(LuStatus.InputError,
  31. string.Format("LuOrderByBinder: {0}", data), "Invalid field syntax");
  32. }
  33. value.Name = split[0];
  34. var order = split.Length == 2 ? split[1].ToLower() : "asc";
  35. if (order == "asc")
  36. {
  37. value.Asc = true;
  38. }
  39. else if (order == "desc")
  40. {
  41. value.Asc = false;
  42. }
  43. else
  44. {
  45. return LuResult<LuOrderByDbo>.Error(LuStatus.InputError,
  46. string.Format("LuOrderByBinder: {0}", data), "Empty order by field order");
  47. }
  48. dbo.Fields.Add(value);
  49. }
  50. }
  51. return LuResult<LuOrderByDbo>.Ok(dbo);
  52. }
  53. public Task BindModelAsync(ModelBindingContext bindingContext)
  54. {
  55. var messageTypeResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
  56. var data = messageTypeResult.FirstValue;
  57. var res = FromString(data);
  58. if (res)
  59. {
  60. bindingContext.Result = ModelBindingResult.Success(res.Data);
  61. }
  62. else
  63. {
  64. bindingContext.Result = ModelBindingResult.Failed();
  65. }
  66. return Task.FromResult(0);
  67. }
  68. }
  69. public class LuOrderByBinderProvider : IModelBinderProvider
  70. {
  71. public IModelBinder GetBinder(ModelBinderProviderContext context)
  72. {
  73. if (context.Metadata.ModelType == typeof(LuOrderByDbo))
  74. {
  75. return new LuOrderByBinder();
  76. }
  77. return null;
  78. }
  79. }
  80. }