[英]System.InvalidCastException: Object must implement IConvertible
[英]Error on conversion System.InvalidCastException: Object must implement IConvertible
我正在尝试创建一个自定义模型绑定器,它可以正确解析传入的请求。 传入的请求在表单中。
https://localhost:5001/api/hotel?filter=name~contains~'hotel'&page=1&pageSize=5
在控制器中,我将模型绑定器用作:
[HttpGet]
public async Task<DataSourceResult> GetHotel([ModelBinder(BinderType = typeof(GridDataSourceRequestModelBinder))] DataSourceRequest request)
{
GridDataSourceRequestModelBinder
看起来像:
public async Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext.ModelType != typeof(DataSourceRequest))
{
return;
}
var request = CreateDataSourceRequest(bindingContext.ModelMetadata, bindingContext.ValueProvider, bindingContext.ModelName);
bindingContext.Result = ModelBindingResult.Success(request);
}
DataSourceRequest
请求
public class DataSourceRequest
{
public DataSourceRequest();
public int Page { get; set; }
public int PageSize { get; set; }
public IList<SortDescriptor> Sorts { get; set; }
public IList<IFilterDescriptor> Filters { get; set; }
public IList<GroupDescriptor> Groups { get; set; }
public IList<AggregateDescriptor> Aggregates { get; set; }
}
CreateDataSourceRequest 方法:
public static DataSourceRequest CreateDataSourceRequest(ModelMetadata modelMetadata, IValueProvider valueProvider, string modelName)
{
var request = new DataSourceRequest();
TryGetValue(modelMetadata, valueProvider, modelName, DataSourceRequestUrlParameters.Page, (int currentPage) => request.Page = currentPage);
TryGetValue(modelMetadata, valueProvider, modelName, DataSourceRequestUrlParameters.PageSize, (int pageSize) => request.PageSize = pageSize);
TryGetValue(modelMetadata, valueProvider, modelName, DataSourceRequestUrlParameters.Filter, (string filter) =>
request.Filters = FilterDescriptorFactory.Create(filter)
);
return request;
}
在TryGetValue
方法中,我有以下代码。
private static void TryGetValue<T>(ModelMetadata modelMetadata, IValueProvider valueProvider, string modelName, string key, Action<T> action)
{
if (modelMetadata.BinderModelName.HasValue())
{
key = modelName + "-" + key;
}
var value = valueProvider.GetValue(key);
if (value.FirstValue != null)
{
//Type typeParameterType = typeof(T);
var convertedValue = TypeDescriptor.GetConverter(typeof(T)).ConvertTo(value, typeof(T));
if (convertedValue != null)
{
action((T)convertedValue);
}
}
}
在下面的代码中转换 typeof(T) 时,
var convertedValue = TypeDescriptor.GetConverter(typeof(T)).ConvertTo(value, typeof(T));
我收到的错误是:
System.InvalidCastException: Object must implement IConvertible.
将值转换为类型(T)时我缺少什么?
附加类:
public static class DataSourceRequestUrlParameters
{
public static string Aggregates { get; set; }
public static string Filter { get; set; }
public static string Page { get; set; }
public static string PageSize { get; set; }
public static string Sort { get; set; }
public static string Group { get; set; }
public static string Mode { get; set; }
public static IDictionary<string, string> ToDictionary(string prefix);
}
我一直在尝试转换IValueProvider
类型的值,所以它给了我一个错误。
所以,我必须使用value.FirstValue
而不是那个。
现在它变成了:
var convertedValue = TypeDescriptor.GetConverter(typeof(T)).ConvertTo(value.FirstValue, typeof(T));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.