Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 根据http请求将字符串转换为枚举并自动设置_C#_Asp.net_Asp.net Web Api - Fatal编程技术网

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
属性。这对您有用吗?您需要将请求作为字符串传递吗?是的。我需要将请求作为字符串传递