如何在 Asp.Net Core 中设置日期绑定的文化?
How to set culture for date binding in Asp.Net Core?
我有一个带有 MVC 的 Asp.Net 核心应用程序。我正在提交表格,表格上有日期。
表单(大致)如下所示:
@model EditCustomerViewModel
<form asp-action="Edit">
<input asp-for="ServiceStartDate" class="form-control" type="date" />
<input type="submit" value="Update" class="btn btn-success" />
</form>
控制器动作是:
[HttpPost]
public async Task<IActionResult> Edit(EditCustomerViewModel viewModel)
{
// do stuff
return RedirectToAction("Index");
}
视图模型是:
public class EditCustomerViewModel
{
public Guid Id { get; set; }
[DataType(DataType.Date)]
public DateTime ServiceStartDate { get; set; }
[DataType(DataType.Date)]
public DateTime? ServiceEndDate { get; set; }
// etc.
}
我在英国,所以日期不是美国格式:dd/MM/YYYY
。所以默认情况下我提交 6/22/2017
。
调试期间在控制器中查看提交的视图模型时,如果以英国格式提交,日期为空,但如果使用美国格式则没有问题。即 6/22/2017
给我 null
,但 22/6/2017
绑定到正确的日期。
我试过将它添加到 Startup.cs
但没有任何区别:
var supportedCultures = new[] { new CultureInfo("en-GB") };
app.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture("en-GB"),
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures
});
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-GB");
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("en-GB");
CultureInfo.CurrentCulture = new CultureInfo("en-GB");
CultureInfo.CurrentUICulture = new CultureInfo("en-GB");
我检查了 HTTP headers,我发布的内容是正确的 header:
Accept-Language: en-GB,en
我做错了什么?我如何告诉 MVC 核心活页夹以英国格式绑定日期?
p.s。我在 VS2017 上使用 *.csproj 项目文件,目标框架 .NetCoreApp 1.1
几件事。我不确定你是否可以像那样将一个新的设置对象推送到中间件中(你可能可以),但大多数时候我看到它在 ConfigureServices 方法中使用,如下所示:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<RequestLocalizationOptions>(options =>
{
options.DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("en-NZ");
options.SupportedCultures = new List<CultureInfo> { new CultureInfo("en-US"), new CultureInfo("en-NZ") };
});
services.AddMvc();
}
其次。中间件的顺序非常重要。确保您对 UseRequestLocalization 的调用发生在 UseMvc 之前。事实上,除非有特定原因,否则它可能应该是您管道中的第一件事。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseRequestLocalization();
app.UseMvc();
}
最后,您能否尝试从管道中删除所有提供程序(其中一个是 cookie 提供程序。我不明白为什么您会有这个 cookie,但让我们试试吧)。
在您的配置方法中调用清除 RequestCultureProviders 列表。这应该确保没有其他东西可以设置文化。
public void ConfigureServices(IServiceCollection services)
{
services.Configure<RequestLocalizationOptions>(options =>
{
options.DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("en-GB");
options.SupportedCultures = new List<CultureInfo> { new CultureInfo("en-GB") };
options.RequestCultureProviders.Clear();
});
services.AddMvc();
}
更多信息:http://dotnetcoretutorials.com/2017/06/22/request-culture-asp-net-core/
aspnet core 2.0 的更新答案
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
var supportedCultures = new[] { new CultureInfo("es-CO") };
app.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture("es-CO"),
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures
});
// other configurations after (not before)
}
以防其他人像我一样遇到这个问题,特别是关于何时在 HTTP Get 查询字符串中提供日期的问题。
如果您在查询字符串中提供日期,启动中的区域性配置将被忽略,即使指定为唯一接受的配置也是如此。
The ASP.NET Core route value provider and query string value provider:
Treat values as invariant culture.
Expect that URLs are culture-invariant.
In contrast, values coming from form data undergo a culture-sensitive conversion. This is by design so that URLs are shareable across locales.
您可以在此处的 Microsoft 文档中查看解决方法:
我有一个带有 MVC 的 Asp.Net 核心应用程序。我正在提交表格,表格上有日期。
表单(大致)如下所示:
@model EditCustomerViewModel
<form asp-action="Edit">
<input asp-for="ServiceStartDate" class="form-control" type="date" />
<input type="submit" value="Update" class="btn btn-success" />
</form>
控制器动作是:
[HttpPost]
public async Task<IActionResult> Edit(EditCustomerViewModel viewModel)
{
// do stuff
return RedirectToAction("Index");
}
视图模型是:
public class EditCustomerViewModel
{
public Guid Id { get; set; }
[DataType(DataType.Date)]
public DateTime ServiceStartDate { get; set; }
[DataType(DataType.Date)]
public DateTime? ServiceEndDate { get; set; }
// etc.
}
我在英国,所以日期不是美国格式:dd/MM/YYYY
。所以默认情况下我提交 6/22/2017
。
调试期间在控制器中查看提交的视图模型时,如果以英国格式提交,日期为空,但如果使用美国格式则没有问题。即 6/22/2017
给我 null
,但 22/6/2017
绑定到正确的日期。
我试过将它添加到 Startup.cs
但没有任何区别:
var supportedCultures = new[] { new CultureInfo("en-GB") };
app.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture("en-GB"),
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures
});
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-GB");
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("en-GB");
CultureInfo.CurrentCulture = new CultureInfo("en-GB");
CultureInfo.CurrentUICulture = new CultureInfo("en-GB");
我检查了 HTTP headers,我发布的内容是正确的 header:
Accept-Language: en-GB,en
我做错了什么?我如何告诉 MVC 核心活页夹以英国格式绑定日期?
p.s。我在 VS2017 上使用 *.csproj 项目文件,目标框架 .NetCoreApp 1.1
几件事。我不确定你是否可以像那样将一个新的设置对象推送到中间件中(你可能可以),但大多数时候我看到它在 ConfigureServices 方法中使用,如下所示:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<RequestLocalizationOptions>(options =>
{
options.DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("en-NZ");
options.SupportedCultures = new List<CultureInfo> { new CultureInfo("en-US"), new CultureInfo("en-NZ") };
});
services.AddMvc();
}
其次。中间件的顺序非常重要。确保您对 UseRequestLocalization 的调用发生在 UseMvc 之前。事实上,除非有特定原因,否则它可能应该是您管道中的第一件事。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseRequestLocalization();
app.UseMvc();
}
最后,您能否尝试从管道中删除所有提供程序(其中一个是 cookie 提供程序。我不明白为什么您会有这个 cookie,但让我们试试吧)。
在您的配置方法中调用清除 RequestCultureProviders 列表。这应该确保没有其他东西可以设置文化。
public void ConfigureServices(IServiceCollection services)
{
services.Configure<RequestLocalizationOptions>(options =>
{
options.DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("en-GB");
options.SupportedCultures = new List<CultureInfo> { new CultureInfo("en-GB") };
options.RequestCultureProviders.Clear();
});
services.AddMvc();
}
更多信息:http://dotnetcoretutorials.com/2017/06/22/request-culture-asp-net-core/
aspnet core 2.0 的更新答案
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
var supportedCultures = new[] { new CultureInfo("es-CO") };
app.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture("es-CO"),
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures
});
// other configurations after (not before)
}
以防其他人像我一样遇到这个问题,特别是关于何时在 HTTP Get 查询字符串中提供日期的问题。
如果您在查询字符串中提供日期,启动中的区域性配置将被忽略,即使指定为唯一接受的配置也是如此。
The ASP.NET Core route value provider and query string value provider: Treat values as invariant culture. Expect that URLs are culture-invariant. In contrast, values coming from form data undergo a culture-sensitive conversion. This is by design so that URLs are shareable across locales.
您可以在此处的 Microsoft 文档中查看解决方法: