3

MVC3 RC2 と DataAnnotations で装飾されたモデルを使用して日付をフォーマットする方法を理解しようとしています。

これは私のモデルです...

public class Model
{
    [Display(Name = "Date of Birth")]
    [DisplayFormat(@DataFormatString = "MM/dd/yyyy")]
    public DateTime DateOfBirth { get; set; }
}

これは私のコントローラーです...

public class IndexController : Controller
{
    public ActionResult Index()
    {
        return View( new Model() {DateOfBirth = DateTime.Now});
    }
}

これが私の見解です...

@model MvcApplication6.Models.Model

@Html.LabelFor(m=>m.DateOfBirth)
@Html.TextBoxFor(m => m.DateOfBirth)
@Html.EditorFor(m => m.DateOfBirth)

サイトを実行すると、両方のコントロールについて、文字列に時間が含まれるテキストボックスがページに表示されますが、必要なのは日付だけです (モデルの装飾されたプロパティで指定されています)。

このパターンには、ModelMetaData に関するBrad Wilson の記事を使用しました。

私が間違っていることは明らかですか?

4

2 に答える 2

7

これを行う:

[DisplayName("Date of Birth")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
public DateTime DateOfBirth { get; set; }
于 2011-01-07T19:35:58.513 に答える
0

DefaultModelBinder実際、ここでの問題は、 が適切な方法で日時を処理しないという事実に関連していると私は信じています(つまり、フロントエンド フィールドをDateTimeパーシャルにバインドできないことを意味します] MVC フレームワーク)。

その問題に正確に対処するために、カスタム モデル バインダーを作成しました。しかし、Scott Hanselman はここで同様のことを行っているので、彼のソリューションをそのまま使用できると思います。

もちろん、属性を使用してこの状況に対処することもできますが、それは、すべてのDateTime フィールドでその特別な書式を指定する必要があることを意味します。そして、それは別の問題を解決しません: 場合によっては、日付部分用に 1 つのフィールドを、フロントエンドにのみ時刻部分用に別のフィールドを用意し、バックエンドに単一の datetime フィールドを保持する必要があります。このモデル バインダー ソリューションはまさにそれを可能にします。

于 2011-01-07T19:39:01.390 に答える