如何在asp.net mvc 4中强制使用datetime格式?
在显示模式下,它显示为我想要的,但是在编辑模型中,它没有显示。
我正在使用displayfor和editorfor,并使用dataformatstring =“{0:dd / MM / yyyy}”和applyformatineditmode = true
我试过的

web.config(两者)中的

  • 全局化以及我的文化和uiculture。
  • 修改application_start()中的区域性和uiculture
  • 用于日期时间的自定义modelbinder

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

    更多信息:
    我的 View 模型是这样的
        [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)。

    自定义modelbinder在application_start()b / c中调用,我不知道在其他地方。

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

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

    最佳答案

    啊,现在很清楚。您似乎在绑定(bind)值时遇到问题。不能在 View 上显示它。确实,这是默认模型绑定(bind)程序的错误。您可以编写并使用一种定制模型,该模型将考虑模型上的[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; }
    }
    

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

    View :
    @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>元素)中设置了哪种区域性还是当前的线程区域性,自定义模型绑定(bind)程序在解析可为空的日期时都将使用DisplayFormat属性的日期格式。

    关于asp.net-mvc - 在asp.net mvc 4中格式化datetime,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11272851/

    10-12 17:16