从控件返回到控制器的无效日期格式
Invalid Date Format Returned To Controller from Control
问题
我正在为 ASP.NET MVC 网格控件使用 Telerik UI 来编辑数据,但是返回到控制器的日期格式无效且 ModelState 无效。我使用的是 "dd/MM/yyyy" 的新西兰格式。所有日期都正确显示在网格中,并且在内联编辑时也是如此。问题似乎发生在将数据发回控制器的过程中。
我试过的
在 Whosebug 上与此问题相关的无数文章中,大多数都指向无效的文化设置。但是,我已经在布局文件中设置了 telerik 网格的文化,请参见下文。我还在启动文件中为 asp.net mvc 核心设置了全局文化。
错误信息
"The value '20/10/2010 12:00:00 a.m.' is not valid for Due Date."
这是我的代码:
- ASP.NET核心KENDO
- UI 用于 ASP.NET MVC
Fiddler 原始 Post:
sort=&group=&filter=&InvoiceID=237&CompanyID=15&Description=Monthlyy&InvoiceDate=30%2F09%2F2010+12%3A00%3A00+a.m.&DueDate=20%2F10%2F2010+12%3A00%3A00+a.m.&Tax=0&Discount=0&Paid=true&Company.CompanyID=15&Company.Name=Engineering&Company.Address=&Company.Phone=&Company.Fax=&Company.CountryID=&Company.Comment=&InvoiceItems=
Fiddler 原始响应:
{"Data":[{"InvoiceID":237,"CompanyID":15,"Description":"Monthlyy","InvoiceDate":null,"DueDate":null,"Tax":0.0,"Discount":0,"Paid":true,"Company":{"CompanyID":15,"Name":"Engineering","Address":null,"Phone":null,"Fax":null,"CountryID":null,"Comment":null},"InvoiceItems":[]}],"Total":1,"AggregateResults":null,"Errors":{"DueDate":{"errors":["The value '20/10/2010 12:00:00 a.m.' is not valid for Due Date."]},"InvoiceDate":{"errors":["The value '30/09/2010 12:00:00 a.m.' is not valid for Invoice Date."]}}}
我的看法:
@(Html.Kendo().Grid<GearBox.Models.Invoice>()
.Name("grid")
.Columns(columns =>
{
columns.Bound(p => p.Description);
columns.Bound(p => p.Company.Name).Filterable(ftb => ftb.Multi(true).Search(true));
columns.Bound(p => p.InvoiceDate).Width(130);
columns.Bound(p => p.DueDate).Width(130);
columns.Bound(p => p.Paid).Width(80).ClientTemplate("<input type='checkbox' disabled='disabled' #= Paid ? checked='checked' :'' # />");
columns.Command(command => { command.Edit(); command.Destroy(); }).Width(200);
})
.ToolBar(toolbar => toolbar.Create())
.Pageable(pageable => pageable
.Input(true)
.Numeric(false)
)
.Sortable()
.Scrollable()
.HtmlAttributes(new { style = "height:430px;" })
.DataSource(dataSource => dataSource
.Ajax()
.PageSize(20)
.Model(model => model.Id(p => p.InvoiceID))
.Events(events => events.Error("onError"))
.Create(update => update.Action("Invoices_Create", "Invoice"))
.Read(read => read.Action("Invoices_Read", "Invoice"))
.Update(update => update.Action("Invoices_Update", "Invoice"))
.Destroy(update => update.Action("Invoices_Destroy", "Invoice"))
)
.Editable(editable => editable.Mode(GridEditMode.PopUp))
)
启动
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
...
app.UseRequestLocalization(BuildLocalizationOptions());
...
app.UseKendo(env);
}
private RequestLocalizationOptions BuildLocalizationOptions()
{
var supportedCultures = new List<CultureInfo>
{
new CultureInfo("en-NZ")
};
var options = new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture("en-NZ"),
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures
};
return options;
}
布局文件的页眉部分
<head>
...
@{
var culture = System.Globalization.CultureInfo.CurrentCulture.ToString();
}
<script src="@("https://kendo.cdn.telerik.com/2016.2.607/js/cultures/kendo.culture." + culture + ".min.js")"></script>
<script>
//Set the current culture
kendo.culture("@culture");
</script>
....
</head>
型号
[ScaffoldColumn(false)]
[Display(Name = "ID")]
[DataType("Integer")]
//[Range(0, int.MaxValue)]
public int InvoiceID { get; set; }
[Required]
public int CompanyID { get; set; }
[Required]
[MaxLength(15)]
public string Description { get; set; }
[Display(Name = "Invoice Date")]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}",
ApplyFormatInEditMode = false)]
public DateTime? InvoiceDate { get; set; }
[Display(Name = "Due Date")]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}",
ApplyFormatInEditMode = false)]
public DateTime? DueDate { get; set; }
编辑器模板
@model DateTime?
@(Html.Kendo().DatePickerFor(m => m).HtmlAttributes(new { style = "width:80%" })))
经过大量浪费时间,该问题已确定与 windows 上 en-NZ 的默认区域设置有关 10. 将区域设置中的日期格式从 AM 和 PM 更改为 a.m。和 p.m。解决了这个问题。这是一个短期解决方法。
问题
我正在为 ASP.NET MVC 网格控件使用 Telerik UI 来编辑数据,但是返回到控制器的日期格式无效且 ModelState 无效。我使用的是 "dd/MM/yyyy" 的新西兰格式。所有日期都正确显示在网格中,并且在内联编辑时也是如此。问题似乎发生在将数据发回控制器的过程中。
我试过的
在 Whosebug 上与此问题相关的无数文章中,大多数都指向无效的文化设置。但是,我已经在布局文件中设置了 telerik 网格的文化,请参见下文。我还在启动文件中为 asp.net mvc 核心设置了全局文化。
错误信息
"The value '20/10/2010 12:00:00 a.m.' is not valid for Due Date."
这是我的代码:
- ASP.NET核心KENDO
- UI 用于 ASP.NET MVC
Fiddler 原始 Post:
sort=&group=&filter=&InvoiceID=237&CompanyID=15&Description=Monthlyy&InvoiceDate=30%2F09%2F2010+12%3A00%3A00+a.m.&DueDate=20%2F10%2F2010+12%3A00%3A00+a.m.&Tax=0&Discount=0&Paid=true&Company.CompanyID=15&Company.Name=Engineering&Company.Address=&Company.Phone=&Company.Fax=&Company.CountryID=&Company.Comment=&InvoiceItems=
Fiddler 原始响应:
{"Data":[{"InvoiceID":237,"CompanyID":15,"Description":"Monthlyy","InvoiceDate":null,"DueDate":null,"Tax":0.0,"Discount":0,"Paid":true,"Company":{"CompanyID":15,"Name":"Engineering","Address":null,"Phone":null,"Fax":null,"CountryID":null,"Comment":null},"InvoiceItems":[]}],"Total":1,"AggregateResults":null,"Errors":{"DueDate":{"errors":["The value '20/10/2010 12:00:00 a.m.' is not valid for Due Date."]},"InvoiceDate":{"errors":["The value '30/09/2010 12:00:00 a.m.' is not valid for Invoice Date."]}}}
我的看法:
@(Html.Kendo().Grid<GearBox.Models.Invoice>()
.Name("grid")
.Columns(columns =>
{
columns.Bound(p => p.Description);
columns.Bound(p => p.Company.Name).Filterable(ftb => ftb.Multi(true).Search(true));
columns.Bound(p => p.InvoiceDate).Width(130);
columns.Bound(p => p.DueDate).Width(130);
columns.Bound(p => p.Paid).Width(80).ClientTemplate("<input type='checkbox' disabled='disabled' #= Paid ? checked='checked' :'' # />");
columns.Command(command => { command.Edit(); command.Destroy(); }).Width(200);
})
.ToolBar(toolbar => toolbar.Create())
.Pageable(pageable => pageable
.Input(true)
.Numeric(false)
)
.Sortable()
.Scrollable()
.HtmlAttributes(new { style = "height:430px;" })
.DataSource(dataSource => dataSource
.Ajax()
.PageSize(20)
.Model(model => model.Id(p => p.InvoiceID))
.Events(events => events.Error("onError"))
.Create(update => update.Action("Invoices_Create", "Invoice"))
.Read(read => read.Action("Invoices_Read", "Invoice"))
.Update(update => update.Action("Invoices_Update", "Invoice"))
.Destroy(update => update.Action("Invoices_Destroy", "Invoice"))
)
.Editable(editable => editable.Mode(GridEditMode.PopUp))
)
启动
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
...
app.UseRequestLocalization(BuildLocalizationOptions());
...
app.UseKendo(env);
}
private RequestLocalizationOptions BuildLocalizationOptions()
{
var supportedCultures = new List<CultureInfo>
{
new CultureInfo("en-NZ")
};
var options = new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture("en-NZ"),
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures
};
return options;
}
布局文件的页眉部分
<head>
...
@{
var culture = System.Globalization.CultureInfo.CurrentCulture.ToString();
}
<script src="@("https://kendo.cdn.telerik.com/2016.2.607/js/cultures/kendo.culture." + culture + ".min.js")"></script>
<script>
//Set the current culture
kendo.culture("@culture");
</script>
....
</head>
型号
[ScaffoldColumn(false)]
[Display(Name = "ID")]
[DataType("Integer")]
//[Range(0, int.MaxValue)]
public int InvoiceID { get; set; }
[Required]
public int CompanyID { get; set; }
[Required]
[MaxLength(15)]
public string Description { get; set; }
[Display(Name = "Invoice Date")]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}",
ApplyFormatInEditMode = false)]
public DateTime? InvoiceDate { get; set; }
[Display(Name = "Due Date")]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}",
ApplyFormatInEditMode = false)]
public DateTime? DueDate { get; set; }
编辑器模板
@model DateTime?
@(Html.Kendo().DatePickerFor(m => m).HtmlAttributes(new { style = "width:80%" })))
经过大量浪费时间,该问题已确定与 windows 上 en-NZ 的默认区域设置有关 10. 将区域设置中的日期格式从 AM 和 PM 更改为 a.m。和 p.m。解决了这个问题。这是一个短期解决方法。