.net - ASP 核心中的本地化查询字符串参数
问题描述
我遇到了一个控制器问题,该控制器在查询字符串中获取一对坐标作为参数。
我的控制器看起来像:
[HttpGet("/location")]
public IActionResult GetForLocation(double lat, double lon)
{
// Do stuff
}
当客户端发送带有不同小数分隔符的坐标(例如/location?lat=4,4&lon=45,5
)时,框架会将它们解析为44
和455
。我app.UseRequestLocalization()
在我的启动课程中使用并查看了当前的线程文化,我得到了正确的小数分隔符值,但模型绑定是错误的。
解决方案
简而言之,查询字符串参数和路径默认情况下被视为不变文化,除非您将QueryStringValueProviderFactory
and替换RouteValueProviderFactory
为以下内容:
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;
}
}
推荐阅读
- c# - C#8 什么是“默认!” 对泛型类型做什么?
- ios - 如何解决此警告“'addressDictionary' 在 iOS 11.0 中已弃用:使用 @properties”
- java - 如何从 SprinBoot ResponseEntity 的角度响应中读取 JSONObject 的 KEY 值
- gulp - Gulp:递归地将文件复制到每个子目录
- web2py - auth_user 中额外字段的验证消息不符合可用的翻译。还有其他人有这个问题吗?
- apache-spark - 从正在更新的镶木地板文件中读取错误
- c# - Lambda 在参差不齐的层次结构中查找对象(或更改对象模型)
- javascript - 如何在具有相似性的节点之间创建边
- web2py - 默认 orderby 列类型为日期时的网格排序错误。还有其他人有这个问题吗?
- javascript - 未定义声明的异步函数?