asp.net-core - 如何将 URL 中的逗号分隔列表绑定(bind)到对象数组?

标签 asp.net-core

我有一个名为 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/

相关文章:

c# - 使用 `UseUrl(...)` 配置文件中的设置?

asp.net-core - 如何从发布中排除 Microsoft.CodeAnalysis.* DLL

c# - .NET Core 应用程序中添加服务引用的简单性是否已被删除?

asp.net - 为什么 ASP.NET Core 将波斯语(或阿拉伯语)文本转换为 View 中的字符引用 (&#xhhhh;)

asp.net-core - 是否可以在 Blazor WebAssembly 应用程序中的同一服务器上托管两个(多个)客户端

c# - Asp.net Core RequestSizeLimit 仍然执行 Action

c# - 如何在 EF Core 3 中启用日志记录?

mono - .NET Core,Mono和ASP.NET在非Windows平台上如何关联?

asp.net-core - aspnet core 2.1中AddSignalR和AddSignalRCore扩展方法的区别

c# - 如何在 .Net Core 3 中引用托管服务?