ASP.NET自定义模型绑定:DateTime [英] ASP.NET Custom Model Binding: DateTime
问题描述
问题
The problem
这时我遇到一个问题,我的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
Get Actions预期:0:MM/dd/yyyy
While the DateTime sent has this format: 0:dd/MM/yyyy
The Get Actions expects: 0:MM/dd/yyyy
解决方案(也许)
The solution (maybe)
为了更改获取"操作的期望,我使用的是自定义模型绑定".
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.
我正在关注这篇文章:
https://weblogs.asp.net/melvynharbour/mvc-modelbinder和本地化
但这是从 2008 !!! 开始的,尽管它似乎是有效的,因为这正是我的GET Action(不同的日期格式)所遇到的问题
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)
更新:附加信息
Update: aditional information
参数日期定义为:
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime FechaLInicioLiq { get; set; }
以及调用该GET Action的URL构建具有针对date参数的以下结构:
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:
- 请勿对参数名称(
date
)进行硬编码.请使用bindingContext.ModelName
. - 如果没有实际提供价值,您应该处理情况.您可以通过比较
IValueProvider.GetValue()
和ValueProviderResult.None
的结果来检查它.
- Do not hardcode parameter name (
date
). UsebindingContext.ModelName
instead. - You should handle situation if value was not actually provided. You could check it by comparing result of
IValueProvider.GetValue()
withValueProviderResult.None
.
以下是示例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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!