gpt4 book ai didi

json - 从 json 到枚举的 Mvc 绑定(bind)问题(从 int 到枚举的自定义异常)

转载 作者:行者123 更新时间:2023-12-01 09:26:04 25 4
gpt4 key购买 nike

我有这个问题:我使用 json 向服务器发送数据。一切正常,但问题是这样的情况:

public enum SexType
{
Male : 0,
Female : 1
}

class People{
public SexType Sex {get;set;}
}

这为我创建了 json:

{"Sex" : 0}

当我发回服务器时,这会用这个问题填充 ModelStateError:从类型“System.Int32”到类型“SexType”的参数转换失败,因为没有类型转换器可以在这些类型之间进行转换。

但如果我用 ' 包装值一切正常:

{"Sex" : '0'}

有人有同样的问题吗?

Tnx 为所有人服务!

最佳答案

是的,我遇到了同样的问题。奇怪的问题是,如果你发回:

{"Sex" : 'Male'}

它会反序列化没有问题。为了解决这个问题,我利用此处找到的示例为枚举实现了一个自定义模型绑定(bind)器(由于存在一些错误而稍作修改): http://eliasbland.wordpress.com/2009/08/08/enumeration-model-binder-for-asp-net-mvc/

namespace yournamespace
{
/// <summary>
/// Generic Custom Model Binder used to properly interpret int representation of enum types from JSON deserialization, including default values
/// </summary>
/// <typeparam name="T">The enum type to apply this Custom Model Binder to</typeparam>
public class EnumBinder<T> : IModelBinder
{
private T DefaultValue { get; set; }

public EnumBinder(T defaultValue)
{
DefaultValue = defaultValue;
}

#region IModelBinder Members
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
return bindingContext.ValueProvider.GetValue(bindingContext.ModelName) == null ? DefaultValue : GetEnumValue(DefaultValue, bindingContext.ValueProvider.GetValue(bindingContext.ModelName).AttemptedValue);
}
#endregion

public static T GetEnumValue<T>(T defaultValue, string value)
{
T enumType = defaultValue;

if ((!String.IsNullOrEmpty(value)) && (Contains(typeof(T), value)))
enumType = (T)Enum.Parse(typeof(T), value, true);

return enumType;
}

public static bool Contains(Type enumType, string value)
{
return Enum.GetNames(enumType).Contains(value, StringComparer.OrdinalIgnoreCase);
}
}
}

然后在 global.asax.cs 中注册模型绑定(bind)器。在你的情况下,它会是这样的:

ModelBinders.Binders.Add(typeof(SexType), new EnumBinder<SexType>(SexType.Male));

我不确定是否有更快的方法,但这很好用。

关于json - 从 json 到枚举的 Mvc 绑定(bind)问题(从 int 到枚举的自定义异常),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5017803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com