C# 根据http请求将字符串转换为枚举并自动设置
我总是可以去做所提到的事情。使用C# 根据http请求将字符串转换为枚举并自动设置,c#,asp.net,asp.net-web-api,C#,Asp.net,Asp.net Web Api,我总是可以去做所提到的事情。使用Enum.TryParse 然而,我所做的是向请求传递一个字符串。然后在我的控制器上创建了一个枚举类型的局部变量,以便我可以将枚举类型传递给我的服务方法以执行任务。我觉得如果我可以直接将其转换为请求的set属性上的Enum类型,那就太好了 这就是我目前拥有的: public enum SearchSortType { None, Rating, Date, Etc } [DataContract] public class MyR
Enum.TryParse
然而,我所做的是向请求传递一个字符串。然后在我的控制器上创建了一个枚举类型的局部变量,以便我可以将枚举类型传递给我的服务方法以执行任务。我觉得如果我可以直接将其转换为请求的set属性上的Enum类型,那就太好了
这就是我目前拥有的:
public enum SearchSortType
{
None,
Rating,
Date,
Etc
}
[DataContract]
public class MyRequest
{
/// <summary>
/// The field to order on.
/// </summary>
/// <value>
/// The order by.
/// </value>
[DataMember(Name = "sortOn")]
public string SortOn { get; set; }
}
public enum SearchSortType
{
没有一个
评级
日期,
等
}
[数据合同]
公共类MyRequest
{
///
///要订购的字段。
///
///
///订单被取消了。
///
[DataMember(Name=“sortOn”)]
公共字符串SortOn{get;set;}
}
我想要的是以下。我将继续发布请求中的字符串
[DataContract]
public class MyRequest
{
/// <summary>
/// The field to order on.
/// </summary>
/// <value>
/// The order by.
/// </value>
[DataMember(Name = "sortOn")]
public SearchSortType SortOn { get; set; }
}
[DataContract]
公共类MyRequest
{
///
///要订购的字段。
///
///
///订单被取消了。
///
[DataMember(Name=“sortOn”)]
公共搜索SORTTYPE SortOn{get;set;}
}
是否可以继续传递字符串并在set属性上转换它(或以任何其他方式转换到枚举),这样我就不必创建局部变量并转换然后使用它?您可以编写自己的模型绑定器来接受字符串
public class EnumModelBinder : DefaultModelBinder
{
/// <summary>
/// Fix for the default model binder's failure to decode enum types when binding to JSON.
/// </summary>
protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext,
PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder)
{
var propertyType = propertyDescriptor.PropertyType;
if (propertyType.IsEnum)
{
var providerValue = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (null != providerValue)
{
var value = providerValue.RawValue;
if (null != value)
{
var valueType = value.GetType();
if (!valueType.IsEnum)
{
return Enum.ToObject(propertyType, value);
}
}
}
}
return base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder);
}
}
您可以编写自己的模型绑定器来接受字符串
public class EnumModelBinder : DefaultModelBinder
{
/// <summary>
/// Fix for the default model binder's failure to decode enum types when binding to JSON.
/// </summary>
protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext,
PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder)
{
var propertyType = propertyDescriptor.PropertyType;
if (propertyType.IsEnum)
{
var providerValue = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (null != providerValue)
{
var value = providerValue.RawValue;
if (null != value)
{
var valueType = value.GetType();
if (!valueType.IsEnum)
{
return Enum.ToObject(propertyType, value);
}
}
}
}
return base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder);
}
}
Enum是一种独特的类型,由一组名为enumerator list的命名常量组成。您可以在请求中传递Enum,并在web api上具有同名的Enum属性,.net model binder将自动将其绑定到Enum。在请求中发送Enum时,它将作为Int发送。Enum是一种独特的类型它由一组名为枚举器列表的命名常量组成。您可以在请求中传递枚举,并在web api上具有同名的枚举属性,.net model binder将自动将其绑定到枚举。当在请求中发送枚举时,它将作为Int发送。传递到
set
的值必须与但是我想您可以创建一个公共字符串SortOnString{get;set;}
这将使用字符串值获取和设置SortOn
属性。这对您有效吗?是否需要将请求作为字符串传递?是的。我需要将请求作为字符串传递传递传递给set
的值必须与属性类型匹配。但是,我想您可以创建公共字符串SortOnString{get;set;}
它将使用字符串值获取和设置SortOn
属性。这对您有用吗?您需要将请求作为字符串传递吗?是的。我需要将请求作为字符串传递