如何在asp.net mvc中格式化datetime 4?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

我怎样才能在asp.net mvc 4中强制使用datetime格式?在显示模式下,它显示为我想要的,但在编辑模式中不显示。我正在使用displayfor和editorfor和applyformatineditmode = true与dataformatstring =“{0:dd / MM / yyyy}”我试过了:

  • web.config中的全球化(包括他们两个)与我的文化和文化。
  • 修改application_start()中的文化和uiculture
  • 自定义modelbinder日期时间

我不知道如何强制它,我需要输入日期为dd / MM / yyyy而不是默认值。

更多信息:我的viewmodel是这样的

    [DisplayName("date of birth")]
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
    public DateTime? Birth { get; set; }

在我看来,我使用,@Html.DisplayFor(m=>m.Birth)但这符合预期(我看到的格式),并输入我使用的日期,@Html.EditorFor(m=>m.Birth)但如果我尝试和输入像13/12/2000东西失败,错误,它不是一个有效的日期(12 / 13/2000和2000/12/13按预期工作,但我需要dd / MM / yyyy)。

自定义模型绑定器在application_start()b / c中调用,我不知道其他位置。

使用<globalization/>我曾尝试过culture="ro-RO", uiCulture="ro"和其他文化,会给我dd / MM / yyyy。我也尝试在application_start()中的每个线程基础上设置它(这里有很多示例,关于如何执行此操作)

对于所有这些将会读到这个问题:只要我没有客户端验证,Darin Dimitrov的答案似乎就会起作用。另一种方法是使用自定义验证,包括客户端验证。我很高兴在重新创建整个应用程序之前发现了这一点。

提问于
用户回答回答于

呃,现在很清楚。似乎遇到绑定该值的问题。不是在视图上显示它。事实上,这是默认模型绑定器的缺点。你可以编写和使用一个自定义[DisplayFormat]的模型来考虑模型的属性。我已经在这里说明了这样的自定义模型联编程序:https : //stackoverflow.com/a/7836093/29407

显然有些问题仍然存在。这里是我完整的设置,在ASP.NET MVC 3和4 RC上都能很好地工作。

模型:

public class MyViewModel
{
    [DisplayName("date of birth")]
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
    public DateTime? Birth { get; set; }
}

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel
        {
            Birth = DateTime.Now
        });
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return View(model);
    }
}

视图:

@model MyViewModel

@using (Html.BeginForm())
{
    @Html.LabelFor(x => x.Birth)
    @Html.EditorFor(x => x.Birth)
    @Html.ValidationMessageFor(x => x.Birth)
    <button type="submit">OK</button>
}

自定义模型联编程序的注册Application_Start

ModelBinders.Binders.Add(typeof(DateTime?), new MyDateTimeModelBinder());

而自定义模型联编程序本身:

public class MyDateTimeModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var displayFormat = bindingContext.ModelMetadata.DisplayFormatString;
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        if (!string.IsNullOrEmpty(displayFormat) && value != null)
        {
            DateTime date;
            displayFormat = displayFormat.Replace("{0:", string.Empty).Replace("}", string.Empty);
            // use the format specified in the DisplayFormat attribute to parse the date
            if (DateTime.TryParseExact(value.AttemptedValue, displayFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
            {
                return date;
            }
            else
            {
                bindingContext.ModelState.AddModelError(
                    bindingContext.ModelName,
                    string.Format("{0} is an invalid date format", value.AttemptedValue)
                );
            }
        }

        return base.BindModel(controllerContext, bindingContext);
    }
}

现在,无论在web.config(<globalization>元素)或当前线程文化中设置了哪种文化,自定义模型联编程序DisplayFormat在解析可空日期时都将使用该属性的日期格式。

用户回答回答于

能够发布到创建方法,它只有在我修改了BindModel代码后才起作用:

public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
    var displayFormat = bindingContext.ModelMetadata.DisplayFormatString;
    var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

    if (!string.IsNullOrEmpty(displayFormat) && value != null)
    {
        DateTime date;
        displayFormat = displayFormat.Replace("{0:", string.Empty).Replace("}", string.Empty);
        // use the format specified in the DisplayFormat attribute to parse the date
         if (DateTime.TryParse(value.AttemptedValue, CultureInfo.GetCultureInfo("en-GB"), DateTimeStyles.None, out date))
        {
            return date;
        }
        else
        {
            bindingContext.ModelState.AddModelError(
                bindingContext.ModelName,
                string.Format("{0} is an invalid date format", value.AttemptedValue)
            );
        }
    }

    return base.BindModel(controllerContext, bindingContext);
}

扫码关注云+社区