ASP.NET MVC2:通过 HTTP GET 进行日期时间模型绑定

发布于 2024-09-18 06:57:06 字数 496 浏览 7 评论 0原文

我在从 QueryString 绑定日期时遇到一些问题:

我有以下模型

public class QueryParms
{
    public DateTime Date { get; set; }
}

和以下控制器操作:

public ActionResult Search( QueryParms query );

我有一个表单,其中有一个可以输入日期的字段。如果表单是 FormMethod.Post,一切都很好,我的日期已正确绑定到我的模型。

如果表单是 FormMethod.Get,则它不再起作用。日期保留为默认值(01/01/0001)

我认为这是一个文化问题: 当我查看值提供程序时,FormValueProvider 为我的日期设置了文化属性:{fr-FR}。 QueryStringValueProvider 没有设置区域性属性。

有没有办法设置这个属性?

I'm getting some trouble binding a date from QueryString :

I have the following model

public class QueryParms
{
    public DateTime Date { get; set; }
}

And the following controller action :

public ActionResult Search( QueryParms query );

I have a form, with a field where I can type my date. If the form is FormMethod.Post, everything is fine, my date is correctly bound to my model.

If the form is FormMethod.Get, it is not working anymore. The date is left to the default value (01/01/0001)

I think it is a culture issue :
When i look into the value provider, the FormValueProvider has a culture property set for my date : {fr-FR}. The QueryStringValueProvider doesn't have the culture property set.

Is there a way to set this property ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

以往的大感动 2024-09-25 06:57:10

这似乎是设计使然:

http://www.pagedesigners.co.nz/2009/12/asp-net-mvc-datetime-binding-and-culture-unaware-urls/

以及解决方案(来自:ASP.net-mvc(2) 中 Modelbinding double 的 CultureInfo 问题)是编写一个新型号活页夹:

public class DateTimeModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var culture = GetUserCulture(controllerContext);

        string value = bindingContext
            .ValueProvider
            .GetValue(bindingContext.ModelName)
            .ConvertTo(typeof(string)) as string;

        if (string.IsNullOrEmpty(value))
        {
            return null;
        }

        return DateTime.Parse(value, culture.DateTimeFormat);
    }

    public CultureInfo GetUserCulture(ControllerContext context)
    {
        var request = context.HttpContext.Request;
        if (request.UserLanguages == null || request.UserLanguages.Length == 0)
            return CultureInfo.CurrentUICulture;

        return new CultureInfo(request.UserLanguages[0]);
    }
}

This seems to be by design :

http://www.pagedesigners.co.nz/2009/12/asp-net-mvc-datetime-binding-and-culture-unaware-urls/

And the solution (from: CultureInfo issue with Modelbinding double in asp.net-mvc(2)) is to write a new model binder :

public class DateTimeModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var culture = GetUserCulture(controllerContext);

        string value = bindingContext
            .ValueProvider
            .GetValue(bindingContext.ModelName)
            .ConvertTo(typeof(string)) as string;

        if (string.IsNullOrEmpty(value))
        {
            return null;
        }

        return DateTime.Parse(value, culture.DateTimeFormat);
    }

    public CultureInfo GetUserCulture(ControllerContext context)
    {
        var request = context.HttpContext.Request;
        if (request.UserLanguages == null || request.UserLanguages.Length == 0)
            return CultureInfo.CurrentUICulture;

        return new CultureInfo(request.UserLanguages[0]);
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文