我有一个带MVC的Asp.Net Core应用程序。我正在提交表格上有日期的表格。
表格看起来(大致)是这样的:
@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标头,并且我发布了正确的标头:
Accept-Language: en-GB,en
我做错了什么?如何告诉MVC Core绑定器以英国格式绑定日期?
P.S。我在VS2017上使用* .csproj项目文件,目标框架.NetCoreApp 1.1
答案 0 :(得分:13)
有几件事。我不确定你是否可以将新的设置对象推送到这样的中间件(你可能可以),但大多数时候我已经看到它在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();
}
二。中间件的顺序非常重要。确保在UseMvc之前调用UseRequestLocalization。事实上它应该是你管道中的第一件事,除非它有一个特定的原因。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseRequestLocalization();
app.UseMvc();
}
最后,你能否尝试从管道中删除所有提供者(其中一个是cookie提供者。我无法理解为什么你会有这个cookie,但让我们尝试一下)。
在您的configure方法中,在RequestCultureProviders列表中调用clear。这应该确保没有其他任何东西来设置文化。
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/
答案 1 :(得分:9)
更新了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)
}