【问题标题】:Localized query string parameters in ASP coreASP 核心中的本地化查询字符串参数
【发布时间】:2021-02-22 15:20:06
【问题描述】:

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

我的控制器看起来像:

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

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

【问题讨论】:

    标签: .net .net-core localization globalization


    【解决方案1】:

    问这个问题几分钟后,我找到了答案,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;
            }
        }
    

    【讨论】:

    • 感谢您分享您的答案。我不知道
    • 不用担心@SaeedEsmaeelinejad,我也不知道,我觉得找到那个文档是一个幸运的打击
    猜你喜欢
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 2017-08-29
    • 2020-06-29
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多