使用[FromQuery]解析枚举值

时间:2019-06-30 16:51:15

标签: asp.net-core enums .net-core html-parsing

我正在使用add_action( 'gform_after_submission', 'set_post_content', 10, 2 ); function update_order_submission( $order_id ) { global $wpdb; //getting orderID $order = wc_get_order( $order_id ); //changing order status $order = array(); $order['ID'] = $order->ID; $order['post_status'] = 'wc-completed'; //updating order wp_update_post( $order ); } 属性将[FromQuery]请求参数解析为复杂的对象。例如:

Get

[HttpGet("some-get-request")] public IActionResult DoSomething([FromQuery] SomeArguments someArgs) { } 对象的属性之一是SomeArguments

enum

然后我用类似这样的名称称呼端点

  

http://localhost:1234/api/some-controller/some-get-request?enum_arg=EnumValue01

这一切都很好。但是,我希望能够在URL中使用与C#枚举值不同的枚举值。例如,我想使用

这样的URL进行呼叫
  

http://localhost:1234/api/some-controller/some-get-request?enum_arg= eval01

我该怎么做?

我以为可以像使用属性一样使用[FromQuery]属性,但这似乎是不可能的:

  

'FromQuery'在此声明类型上无效。它仅对“属性,索引器,参数”有效

1 个答案:

答案 0 :(得分:0)

您可以将EnumMemberAttributeStringEnumConverter结合使用以实现您的目标。如下定义SomeEnum

[JsonConverter(typeof(StringEnumConverter))]
public enum SomeEnum
{
    [EnumMember(Value = "eval01")]
    EnumValue01,

    [EnumMember(Value = "eval02")]
    EnumValue02
}

这时,仅当使用Newtonsoft json序列化程序时(例如,当控制器期望POST请求并且参数标记为[FromBody]时,它才可以根据需要工作)。您的情况尚无法使用,因为在[FromQuery]参数绑定期间未使用json序列化程序。要解决这个问题,请创建custom model binder

public class JsonModelBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        string rawData = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).FirstValue;
        rawData = JsonConvert.SerializeObject(rawData); //turns value to valid json
        try
        {
            SomeEnum result = JsonConvert.DeserializeObject<SomeEnum>(rawData); //manually deserializing value
            bindingContext.Result = ModelBindingResult.Success(result);
        }
        catch (JsonSerializationException ex)
        {
            //do nothing since "failed" result is set by default
        }


        return Task.CompletedTask;
    }
}

更新SomeEnum定义以使用JsonModelBinder

[JsonConverter(typeof(StringEnumConverter))]
[ModelBinder(typeof(JsonModelBinder))]
public enum SomeEnum