2017-12-27 257 views
-1

我想在我的web api .Net核心請求中替換所有۱字符與1
如:
Number ۱應該轉換爲Number 1
在MVC 5我以前HttpModule,在.NET的核心我用中間件如下:在.NET核心請求,C#中的表單字段中替換一些字符?

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]是隻讀的,我不能賦值給它?
實際上,我必須編輯窗體的所有字符串字段,我應該怎麼做?
我可以使用自定義模型綁定器嗎?

+0

@mjwills我不得不標準所有數字字符字符串字段並將其轉換爲英語 –

+1

的可能的複製[如何修改asp.net核心中的HttpContext.Request.Form](https://stackoverflow.com/questions/42701311/how-to-modify-httpcontext-request-form-in-asp-net-core) – mjwills

+0

I可以用自定義模型活頁夾寫入,請參閱答案 –

回答

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()); 
      });