我想在我的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,我不能赋予它价值?
实际上,我必须编辑表单的所有字符串字段,我该怎么做?
我可以使用自定义模型绑定器吗?
我可以用自定义模型绑定器编写它:
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());
});