替换.Net Core Request,C#中的表单字段中的一些字符?

问题描述 投票:-1回答:1

我想在我的web api .Net Core请求中用۱替换所有1字符? 例如: Number ۱应该转换为Number 1 在MVC 5中我使用了HttpModule,在.net核心中我使用了中间件如下:

namespace VistaBest.Api
{
    public class PersianCharsMiddleware
    {
        private readonly RequestDelegate _next;
        public PersianCharsMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public Task Invoke(HttpContext httpContext)
        {
            var collection = httpContext.Request.Form;
            foreach (var controlKey in collection.Keys.Where(controlKey => !controlKey.StartsWith("__")))
            {
                collection[controlKey] = collection[controlKey].ToString().Replace("۱", "1");
            }
            return _next(httpContext);
        }
    }

    public static class PersianCharsMiddlewareExtensions
    {
        public static IApplicationBuilder UsePersianCharsMiddleware(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<PersianCharsMiddleware>();
        }
    }
}

collection[controlKey]是Readonly,我不能赋予它价值? 实际上,我必须编辑表单的所有字符串字段,我该怎么做? 我可以使用自定义模型绑定器吗?

c# asp.net-core
1个回答
0
投票

我可以用自定义模型绑定器编写它:

public class PersianCharsModelBinder : IModelBinder
{
    private readonly IModelBinder _simpleTypeModelBinder;
    public PersianCharsModelBinder(IModelBinder simpleTypeModelBinder)
    {
        _simpleTypeModelBinder = simpleTypeModelBinder;
    }

    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (valueProviderResult == ValueProviderResult.None) return _simpleTypeModelBinder.BindModelAsync(bindingContext);
        bindingContext.ModelState.SetModelValue(bindingContext.ModelName, valueProviderResult);
        var valueAsString = valueProviderResult.FirstValue;
        if (string.IsNullOrWhiteSpace(valueAsString)) return _simpleTypeModelBinder.BindModelAsync(bindingContext);
        var model = valueAsString.ToEnglishNumber().RemoveArabicChars();
        bindingContext.Result = ModelBindingResult.Success(model);
        return Task.CompletedTask;
    }
}

public class PersianCharsBinderProvider : IModelBinderProvider
{
    public IModelBinder GetBinder(ModelBinderProviderContext context)
    {
        if (context == null) throw new ArgumentNullException(nameof(context));
        if (context.Metadata.IsComplexType) return null;
        var simpleTypeModelBinder = new SimpleTypeModelBinder(context.Metadata.ModelType);
        if (context.Metadata.ModelType == typeof(string)) return new PersianCharsModelBinder(simpleTypeModelBinder);
        return simpleTypeModelBinder;
    }
}

Startup.cs

services.AddMvc(options =>
            {
                options.ModelBinderProviders.Insert(0, new PersianCharsBinderProvider());
            });
© www.soinside.com 2019 - 2024. All rights reserved.