ASP 核心中的本地化查询字符串参数

问题描述

我在使用控制器时遇到问题,该控制器在查询字符串中获取一对坐标作为参数。

我的控制器看起来像:

[HttpGet("/location")]
public IActionResult GetForLocation(double lat,double lon)
{
// Do stuff
}

当客户端使用不同的小数分隔符(例如 /location?lat=4,4&lon=45,5)发送坐标时,框架会将它们解析为 44455。我在启动课程中使用了 app.UseRequestLocalization() 并查看了当前的线程文化,我得到了小数分隔符的正确值,但模型绑定是错误的。

解决方法

问这个问题几分钟后我找到了答案,https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding?view=aspnetcore-5.0#globalization-behavior-of-model-binding-route-data-and-query-strings

简而言之,除非您将 QueryStringValueProviderFactoryRouteValueProviderFactory 替换为以下内容,否则默认情况下查询字符串参数和路径被视为不变文化:

    public class CulturedQueryStringValueProviderFactory : IValueProviderFactory
    {
        /// <inheritdoc />
        public Task CreateValueProviderAsync(ValueProviderFactoryContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            var query = context.ActionContext.HttpContext.Request.Query;

            if (query != null && query.Count > 0)
            {
                var valueProvider = new QueryStringValueProvider(
                    BindingSource.Query,query,CultureInfo.CurrentCulture);

                context.ValueProviders.Add(valueProvider);
            }

            return Task.CompletedTask;
        }
    }
    public class CulturedRouteValueProviderFactory : IValueProviderFactory
    {
        /// <inheritdoc />
        public Task CreateValueProviderAsync(ValueProviderFactoryContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            var valueProvider = new RouteValueProvider(
                BindingSource.Path,context.ActionContext.RouteData.Values,CultureInfo.CurrentCulture);

            context.ValueProviders.Add(valueProvider);

            return Task.CompletedTask;
        }
    }

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...