0

ユーザーがテキストフィールドに合計 6 桁の「yymmdd」形式で日付を入力できるようにする必要があります。

フォームは目立たない ajax を介して mvc3 コントローラー/アクションに投稿され、エンティティ フレームワーク 4.1 を介してこれを mysql データベースに保持します。残念ながら、日付を目的の「yymmdd」形式で入力すると、日付がnullとして保存されます。

私の質問は、カスタムの日付形式を使用し、クライアント側とサーバー側の検証を保持し、この日付をデータベースに正常に保持する方法です。検証に正規表現を使用してよかったのですが、カスタムの日付形式を解析するには助けが必要です。

モデルの日付は次のように指定されます

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();
}
4

1 に答える 1

1

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>
于 2011-09-19T13:04:00.470 に答える