我正在使用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'在此声明类型上无效。它仅对“属性,索引器,参数”有效
答案 0 :(得分:0)
您可以将EnumMemberAttribute
与StringEnumConverter
结合使用以实现您的目标。如下定义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