0

私はこれについてWebを執拗に検索しましたが、何も見つかりませんでした.これは驚くべきことです。

基本的に、私のモデルにはDateTime、ユーザーがフォームから入力したいフィールドがあります。Htmlヘルパーを使用して、フォームの他のすべての部分をレンダリングしています(検証とともに)

したがって、この質問は2つの部分に分かれています...

HTML ヘルパー

まず、Html ヘルパーを使用してDateTimeフィールドを分割し、日付の 3 つの構成部分 (日、月、年) としてレンダリングする方法はありますか (時間の部分は気にしないため)。これは、テキスト ボックス、ドロップダウン リスト、または両方の組み合わせとしてレンダリングできます。

モデルバインディング

次に、フォームが投稿されたときに、モデルにバインドするための最良の方法は何ですか? これに対する Scott Hanselmann のソリューションを見たことがありますが、必要なものに対して少し肥大化しているように見えます。もう少しエレガントなソリューションを望んでいました。それをデフォルトのバインダーとして拡張DefaultModelBinderして設定することをお勧めします(すべての日付がこのように処理されるため)、またはそれを実装してタイプIModelBionderのデフォルトのバインダーとして設定するクラスを作成しますか?DateTime

事前にすべての助けに感謝します:-) 私はMVCが大好きですが、とても些細なことで頭痛の種になっていることに腹を立てています!

4

1 に答える 1

1

私はこれに対してまともな解決策を考え出したと思うので、将来これに出くわした人には答えを提供します!

Html ヘルパーに関しては、どういうわけか拡張メソッドの作成を完全に見落としていました。最終的に私が思いついたとき、基本的にHtmlヘルパーの他のメソッドを呼び出して3つのフィールドを提供する拡張メソッドを作成しました(テキスト入力のドロップダウンを使用するかどうかはあなたの選択です)

    public static string DateTime(this HtmlHelper helper, string name)
    {
        StringBuilder builder = new StringBuilder();
        string dayName = name + ".Day";
        string monthName = name + ".Month";
        string yearName = name + ".Year";

        builder.Append(helper.TextBox(dayName));
        builder.Append(helper.DropDownList(monthName, typeof (Months)));
        builder.Append(helper.TextBox(yearName));

        return builder.ToString();
    }

フォーム投稿後のバインディングに関しては、アプリケーションの開始時にタイプIModelBinderのデフォルトとして実装して設定するクラスを作成しました。DateTimeこれは、別のバインド方法が必要な場合に、コントローラー アクション レベルでオーバーライドできます。これは本質的に、質問でリンクしたスコットのバインダーのより単純なバージョンでした。

現時点では魅力的に動作しますが (少し単純化されている場合)、この問題に戸惑っている他の人にとっては十分な基盤になると確信しています!

于 2010-05-25T09:54:56.053 に答える