MVC3 で JQuery 日付ピッカーを使用するための完全なソリューションを見つけることができませんでした。さまざまなページで見つけたものから、思い通りに機能しないソリューションを思いつきました。私は次のものを持っています:
モデル:
public class Some
{
[Display(Name = "DateCreated", ResourceType = typeof(Resources))]
[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "RequiredField")]
[DataType(DataType.Date, ErrorMessage = "Date non valid.")]
[DisplayFormat(NullDisplayText = "NotSpecified", DataFormatString = "{0:dd.MM.yyyy.}")]
public DateTime DateCreated { get; set; }
}
クライアントとサーバー側の検証とテキストが必要なため、プロパティを装飾しています。
この例では Home コントローラーを使用しています。
public ActionResult Index()
{
Some model = new Some { DateCreated = DateTime.Now };
return View(model);
}
[HttpPost]
public ActionResult Index(Some model)
{
if (ModelState.IsValid)
{
return RedirectToAction("Index");
}
return View(model);
}
景色:
@model TestDatePicker.Models.Some
@using (Html.BeginForm())
{
<div class="editor-label">
@Html.LabelFor(model => model.DateCreated)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.DateCreated)
@Html.ValidationMessageFor(model => model.DateCreated)
</div>
<p>
<input type="submit" value="Save" />
</p>
}
DateTime 型のフィールドをレンダリングするためのカスタム テンプレート:
@model Nullable<System.DateTime>
@{
string controlName = ViewData.TemplateInfo.HtmlFieldPrefix;
string controlId = controlName.Replace(".", "_");
if ( Model.HasValue ) {
@Html.TextBox("", String.Format("{0:dd.MM.yyyy.}", Model.Value), new { @class = "textbox", name = controlName })
}
else {
@Html.TextBox("", String.Format("{0:dd.MM.yyyy.}", DateTime.Now), new { @class = "textbox", name = controlName })
}
}
}
<script type="text/javascript">
$(document).ready(function () {
$(".textbox").datepicker
({
dateFormat: 'dd.mm.yy.',
showStatus: true,
showWeeks: true,
highlightWeek: true,
numberOfMonths: 1,
showAnim: "scale",
showOptions: {
origin: ["top", "left"]
},
onClose: function () {
$(this).valid();
}
});
});
</script>
このコードで何が起こっていますか? DateTime フィールドの値はカスタム テンプレートで割り当てられ、今日の日付として表示されます。
- ただし、[保存] ボタンをクリックすると、[HttpPost] Index メソッドで、渡されたモデルが今日の日付値を保持していないことがわかりますが、0001/1/1 12:00:00 AM?
- 次に、Model.IsValid はメッセージThe value '26.05.2012.'と共に渡されません。作成日には無効です。??? 私にはさらに奇妙に思えます!
- 上記のメッセージは、カスタム メッセージの代わりにページに表示されます: [DataType(DataType.Date, ErrorMessage = "Date non valid.")]
興味深いことに、datepicker を使用してそこからデータを選択すると、モデル内のプロパティが入力されます。Model.IsValid は TRUE です。
入力コントロールの html は次のようになります。
<input class="textbox" data-val="true" data-val-required="Requred field" id="DateCreated" name="DateCreated" type="text" value="26.05.2012." />
JQueryUI の日付ピッカーは、ASP.NET MVC の最適な選択ではありませんか? ネット全体で見られるカスタム テンプレートのこのソリューションでは、基本的な MVC も機能していないようです。これを行うための完全なチュートリアルを知っている人はいますか? こうした問題に直面するのは私が初めてではありません。
ありがとうございました。
MVC3 と datepicker について話すときに誰もが参照するブログ投稿で作成されたコードをダウンロードしましたが、そこでも同じことが起こっています!