.net mvc3实体框架webapp中的自定义日期输入格式?

发布于 2024-12-05 05:04:02 字数 625 浏览 1 评论 0原文

我要求允许用户以“yymmdd”格式输入日期,在文本字段中总共 6 位数字。

该表单通过不显眼的 ajax 发布到 mvc3 控制器/操作,该控制器/操作通过 Entity Framework 4.1 将其保存到 mysql 数据库。不幸的是,如果我以所需的“yymmdd”格式输入日期,它会将日期保存为空。

我的问题是如何使用自定义日期格式,保留客户端和服务器端验证并成功将此日期保留到数据库中。我很高兴使用正则表达式进行验证,但需要帮助来解析自定义日期格式。

模型中的日期指定为

public class CustomDate {
  [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyMMdd}")]
  //[RegularExpression(@"^[0-9]{6}$")]
  public DateTime? Something { get; set; } 
}

支持表单的操作具有以下签名。

public JsonResult NewClaim(CustomDate d) {
db.CustomDate.Add.(d);
db.SaveChanges();
}

I have the requirement that users should be allowed to enter dates in the format "yymmdd", 6 digits in total in a textfield.

The form is posted via unobtrusive ajax to a mvc3 controller/action which persists this to a mysql database via Entity Framework 4.1. Unfortionently it saves the date as a null if I enter the date in the desired "yymmdd" format.

My question is how do I use a custom date format, retain client- and serverside validation and successfully persist this date into the database. I'm happy to use a regexp for the validation but need help to parse the custom date format.

The date in the modelis specified as

public class CustomDate {
  [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyMMdd}")]
  //[RegularExpression(@"^[0-9]{6}$")]
  public DateTime? Something { get; set; } 
}

The action backing the form have the following signature.

public JsonResult NewClaim(CustomDate d) {
db.CustomDate.Add.(d);
db.SaveChanges();
}

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

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

发布评论

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

评论(1

枕梦 2024-12-12 05:04:02

您可以为服务器端验证编写一个自定义模型绑定器:

public class DateModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (value == null) 
        {
            return null;
        }

        var format = bindingContext.ModelMetadata.EditFormatString ?? string.Empty;
        format = format.Replace("{0:", string.Empty).Replace("}", string.Empty);
        if (!string.IsNullOrEmpty(format))
        {
            DateTime date;
            if (DateTime.TryParseExact(value.AttemptedValue, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
            {
                return date;
            }
        }
        return base.BindModel(controllerContext, bindingContext);
    }
}

您可以在 Application_Start 中注册它:

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

对于客户端验证,可以采用不同的技术。例如,您可以手动处理它:

<script>
    $.validator.addMethod('myDate', function (value, element) {
        // TODO: validate if the value corresponds to the required format
        // and return true or false based on it
        return false;
    }, 'Please enter a date in the format yyMMdd');

    $(function () {
        // Attach the myDate custom rule to the #Something element
        $('#Something').rules('add', 'myDate');
    });
</script>

You could write a custom model binder for the server side validation:

public class DateModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (value == null) 
        {
            return null;
        }

        var format = bindingContext.ModelMetadata.EditFormatString ?? string.Empty;
        format = format.Replace("{0:", string.Empty).Replace("}", string.Empty);
        if (!string.IsNullOrEmpty(format))
        {
            DateTime date;
            if (DateTime.TryParseExact(value.AttemptedValue, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
            {
                return date;
            }
        }
        return base.BindModel(controllerContext, bindingContext);
    }
}

which you would register in Application_Start:

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

For the client side validation there are different techniques that could be employed. For example you could handle it manually:

<script>
    $.validator.addMethod('myDate', function (value, element) {
        // TODO: validate if the value corresponds to the required format
        // and return true or false based on it
        return false;
    }, 'Please enter a date in the format yyMMdd');

    $(function () {
        // Attach the myDate custom rule to the #Something element
        $('#Something').rules('add', 'myDate');
    });
</script>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文