3

現在、MVC 3 ビューの複数のフィールドをビュー モデルの 1 つのプロパティにバインドする方法と、これを達成しようとするときに推奨される方法を理解しようとしています。

何かを準備するのにかかる分数 (のみ) の例を使用します。

フォームは次のようになります。

準備時間 - 時間: [ 1 ] 分: [ 30 ]

また、送信されたフォームの値を分に変換し、ViewModel の PreparationTimeInMinutes プロパティにバインドする必要があります。

ViewModel プロパティ:

public short PreparationTimeInMinutes { get; set; }

ビューはViewModelに強く型付けされており、現在以下を持っています:

<div class="editor-label">
    @Html.LabelFor(model => model.PreparationTimeInMinutes)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.PreparationTimeInMinutes)
    @Html.ValidationMessageFor(model => model.PreparationTimeInMinutes)
</div>

これを実現するために考え始めたことがいくつかあります。

  1. MVC3 がバインドと検証を整理できるように、PreparationTimeInMinutes プロパティを時間と分のプロパティを持つ ViewModel に変更し、そのためのエディターと表示テンプレートを作成しますか?
  2. 準備時間には JavaScript と非表示フィールドを使用します。
  3. この種のことを行うために MVC モデル バインディングを使用できる他のアプローチはありますか?

この種のベストプラクティスに関する提案はありますか? または私が離れている場合。

私にお知らせください。ありがとう

4

3 に答える 3

2

Javascript は悪くはありませんが、実際には MVC っぽくはありません。より良いアプローチは、これらの 2 つのフィールドを持つビュー モデルか、エディター/表示テンプレートを使用して新しいクラスを作成することだと思います。

SLaks に同意します。これを処理するカスタム モデル バインダーを作成できますが、おそらくやり過ぎです。この記事に基づいて、1 つの日付と 2 つの時刻を持つ型のカスタム バインダーを作成しましたが、私のものははるかに単純です。しかし、練習したいだけ、またはモデル バインディングについてさらに学びたい場合は、実行可能です。

編集: 申し訳ありませんが、ModelBinder ルートを試すことにした場合に備えて、その例は少し古いです (おそらく MVC 1?!)。追加の変更を行う必要があることを忘れていました。 これらの リンクは、その例の更新に役立つはずです。幸運を。

于 2012-04-03T23:18:35.993 に答える
1

最初のオプションを使用する必要があります。
これは、まさにエディター テンプレートが作成されたものです。

必要に応じて、カスタム ModelBinder を作成して、POST された 2 つの値を 1 つの数値にバインドし (同様のエディター テンプレートを使用して)、プロパティに属性を適用してその ModelBinder を選択することができます。
しかし、それはおそらくやり過ぎでしょう。

于 2012-04-03T22:39:36.950 に答える
0

ありがとうSLaks。

最初のオプションを使用して、ビューモデルで以下を行いました

public TimeInMinutesViewModel PreparationTimeInMinutes { get; set; }

このビューモデルを作成しました

    public class TimeInMinutesViewModel {
    public string Label { get; set; }
    public short Hours { get; set; }
    public short Minutes { get; set; }
}

そしてこのエディタテンプレート

@model TimeInMinutesViewModel

<div>@Html.LabelFor(x => x.Label)</div>
<div class="editor-label">@Html.LabelFor(x => x.Hours)</div>
<div class="editor-field">@Html.EditorFor(x => x.Hours)</div>
<div class="editor-label">@Html.LabelFor(x => x.Minutes)</div>
<div class="editor-field">@Html.EditorFor(x => x.Minutes)</div>

そしてビューで

@Html.EditorFor(model => model.PreparationTimeInMinutes)
@Html.ValidationMessageFor(model => model.PreparationTimeInMinutes)

これはまだテストしていないので、ラベルを変更する必要があるかもしれませんが、このアプローチを使用したい 2 つの異なるプロパティで機能するようです。

私が今抱えている問題は、これらを短いintであるエンティティプロパティにマップできることです。

私はAutoMapperを使用しているので、これがカスタム型コンバーターで少なくとも1方向で機能することを望んでいますが、両方向についてはわかりません:(

于 2012-04-03T23:17:51.357 に答える