ASP.NET 自定义模型绑定:DateTime [英] ASP.NET Custom Model Binding: DateTime

查看:15
本文介绍了ASP.NET 自定义模型绑定:DateTime的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题

此时我遇到了一个问题,即我的 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.

我正在关注这篇文章:

https://weblogs.asp.net/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:

  1. 不要硬编码参数名称(date).请改用 bindingContext.ModelName.
  2. 如果没有实际提供价值,您应该处理这种情况.您可以通过将 IValueProvider.GetValue() 的结果与 ValueProviderResult.None 进行比较来检查它.
  1. Do not hardcode parameter name (date). Use bindingContext.ModelName instead.
  2. You should handle situation if value was not actually provided. You could check it by comparing result of IValueProvider.GetValue() with ValueProviderResult.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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆