我有一个名为 VerseRangeReference 的类,它具有 Chapter、FirstVerse 和 LastVerse 属性。
我用 TypeConverterAttribute [TypeConverter(typeof(VerseRangeReferenceConverter))]
装饰它
我在这样的 Controller 上有一个操作
public Task<ViewResult> Verses(VerseRangeReference[] verses)
但是 verses
的值始终是值为 null
的单个元素。这是我的类型转换器
public class VerseRangeReferenceConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return sourceType == typeof(string);
}
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
if (value == null)
throw new ArgumentNullException(nameof(value));
if (value.GetType() == typeof(string))
{
string source = (string)value;
return VerseRangeReference.ParseMultiple(source);
}
return null;
}
}
VerseRangeReference.ParseMultiple(source)
的结果是 VerseRange 实例的有效数组。
最佳答案
我必须实现一个自定义模型绑定(bind)器。如果有人能想出一种方法来使用 TypeConverter 来做到这一点,那么我会接受这个答案,因为模型绑定(bind)器更复杂。
public class VerseRangeReferenceArrayModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
string modelName = bindingContext.ModelName;
ValueProviderResult valueProviderResult = bindingContext.ValueProvider.GetValue(modelName);
if (valueProviderResult != ValueProviderResult.None)
{
VerseRangeReference[] verseRangeReferences = VerseRangeReference.ParseMultiple(valueProviderResult.FirstValue);
bindingContext.Result = ModelBindingResult.Success(verseRangeReferences);
}
return Task.CompletedTask;
}
}
public class VerseRangerReferenceArrayModelBinderProvider : IModelBinderProvider
{
public IModelBinder GetBinder(ModelBinderProviderContext context)
{
if (context.Metadata.ModelType == typeof(VerseRangeReference[]))
return new BinderTypeModelBinder(typeof(VerseRangeReferenceArrayModelBinder));
return null;
}
}
必须注册。
services.AddMvc(options =>
{
options.ModelBinderProviders.Insert(0, new VerseRangerReferenceArrayModelBinderProvider());
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
关于asp.net-core - 如何将 URL 中的逗号分隔列表绑定(bind)到对象数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52127911/