问题
此时我遇到了一个问题,即我的 Get 操作试图以不同格式读取发送的 DateTime 参数.
At this point I have a problem where my Get action is trying to read a DateTime parameter in a diferent format that is sent.
虽然发送的 DateTime 格式如下:0:dd/MM/yyyy获取操作期望:0:MM/dd/yyyy
While the DateTime sent has this format: 0:dd/MM/yyyy The Get Actions expects: 0:MM/dd/yyyy
解决方案(也许)
为了更改 Get 操作所期望的内容,我使用了自定义模型绑定.
In order to change what the Get action is expecting I'm using a Custom Model Binding.
GET 操作
public async Task<IActionResult> Details(int? id, [ModelBinder(typeof(PModelBinder))]DateTime date)ModelBinder 类
现在这里缺少一些东西,我不知道如何正确完成它:
Now here are a few things that are missing and I don't know how to complete it properly:
public class PModelBinder : IModelBinder { public Task BindModelAsync(ModelBindingContext bindingContext) { string theDate = bindingContext.HttpContext.Request.QueryString["date"]; //What should I write inside the []? //I've tried QueryString["date"] which is the name of the parameter but it says is wrong DateTime dt = new DateTime(); bool success = DateTime.TryParse(date); //Should I apply ParseExact? How should I do it? if (success) { return new //what should I be returning here? dt? } } }由于我刚刚开始了解自定义模型绑定,因此我在上面的代码中将几个问题标记为注释.希望有人能给我一些建议.
I've several questions marked as comments in the code above since I'm just starting to understand Custom Model Binding. Hope anyone can give me some advice.
我正在关注这篇文章:
weblogs.asp/melvynharbour/mvc-modelbinder-和本地化
但它来自 2008 年!!!,虽然这似乎是有效的,因为这正是我的 GET 操作(不同的日期格式)遇到的问题
But it's from 2008!!!, Although it seems valid since it's exactly the problem I'm having with my GET Action (diferent date formats)
更新:附加信息
参数日期定义为:
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] public DateTime FechaLInicioLiq { get; set; }调用 GET 操作时构建的 URL 具有日期参数的这种结构:
and the URL build when calling that GET Action has this structure for the date parameter:
date=10%2F11%2F2017%200%3A00%3A00 推荐答案你的模型绑定器实现有几个问题:
You have several issues with your model binder implementation:
这是完成您需要的示例 DateTime 模型绑定器:
Here is sample DateTime model binder that accomplish what you need:
public class DateTimeModelBinder : IModelBinder { private readonly IModelBinder baseBinder = new SimpleTypeModelBinder(typeof(DateTime)); public Task BindModelAsync(ModelBindingContext bindingContext) { var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); if (valueProviderResult != ValueProviderResult.None) { bindingContext.ModelState.SetModelValue(bindingContext.ModelName, valueProviderResult); var valueAsString = valueProviderResult.FirstValue; // valueAsString will have a string value of your date, e.g. '31/12/2017' var dateTime = DateTime.ParseExact(valueAsString, "dd/MM/yyyy", CultureInfo.InvariantCulture); bindingContext.Result = ModelBindingResult.Success(dateTime); return Task.CompletedTask; } return baseBinder.BindModelAsync(bindingContext); } }更多推荐
ASP.NET 自定义模型绑定:DateTime
发布评论