3

私は MVC3 を初めて使用し、優れたプログラミング プラクティスを習得しようとしています。DateTime をどのようにフォーマットするのに苦労しましたか? 日付の元のクラスに関連付けられた明示的な ModelName.cs ファイルを持たない MVC3 プロジェクトに表示されていました。

データベースは既に配置されており、モデルを取得する .edmx (私たちのものは Pooling.edmx と呼ばれます) を使用します。私は明らかに、この広く受け入れられているソリューションに合わせてデザイナー ファイルを編集したくありませんでした: Date only from TextBoxFor()

次に、ここで見つけた別の解決策を試しました: Using Html.TextBoxFor with class and custom property (MVC)

以下を使用します。

@Html.TextBoxFor(m => m.Name, new { data_bind="value: Name", @class = "title width-7" })

カスタム属性の使用、クラス名の追加、値の設定を一度に行うことができたので、これは機能しました。

私はこれを変換しました:

@Html.TextBoxFor(m => Model.PrePoolOwner.OglDateEffective, new Dictionary<string, object> { { "class", "check-dirty input-small datePicker" }, { "data-original-value", @Model.PrePoolOwner.OglDateEffective } })

これに(これは本当に醜いようです...そして私に質問につながります):

@Html.TextBoxFor(m => Model.PrePoolOwner.OglDateEffective, new { data_original_value = Model.PrePoolOwner.OglDateEffective.HasValue ? Model.PrePoolOwner.OglDateEffective.Value.ToString("MM/dd/yyyy") : null, @class = "datePicker check-dirty", @Value = Model.PrePoolOwner.OglDateEffective.HasValue ? Model.PrePoolOwner.OglDateEffective.Value.ToString("MM/dd/yyyy") : null })

情報を表示するには、これらの他の方法 (アンダースコアがダッシュに変換されるなど) を見つけて使用する方が良いですか、それとも ModelName.cs ファイルを使用してモデル レベルでの表示方法を変更する必要がありますか?

なんらかの理由で、私たちのデータベースをマッピングする巨大な Pooling.edmx ファイルを持っていると、Web サイトが進化するにつれてデータにアクセス/提示/変更する方法が制限されているように感じます。

上記の Model.PrePoolOwner.OglDateEffective によって呼び出される「PrePoolOwner」オブジェクトを取得するために、次のことを行う PrePoolOwnerRow.cs ファイルがあります。

namespace OCC_Tracker.Models
{
    public class PrePoolOwnerRow
    {
        public bool Dirty { get; set; }
        public bool Delete { get; set; }

        public PrePoolOwner PrePoolOwner { get; set; }

        public PrePoolOwnerRow(PrePoolOwner owner)
        {
            this.Dirty = false;
            this.Delete = false;
            this.PrePoolOwner = owner;
        }

        public PrePoolOwnerRow()
        { }
    }
}

次に、.cshtml ファイルの先頭で呼び出します

@model OCC_Tracker.Models.PrePoolOwnerRow
4

1 に答える 1

1

わかりましたので、いくつか提案します。

まず、あなたの例でPrePoolOwnerRowは、あなたのビューモデルです。これ自体は問題ありません。しかし、コードの匂いはPrePoolOwner、ビュー モデルを通じてドメイン エンティティを公開する場所ですPrePoolOwnerRow

したがって、最初に提案することは、ビューモデルを次のようなものに更新することです。

public class PrePoolOwnerModel
{
    public bool Dirty { get; set; }
    public bool Delete { get; set; }

    public DateTime? OglDateEffective { get; set; }
    public String OglDateEffective { get; set; }

    // Other public properties here that map to properties on your PrePoolOwner entity.
}

ここで行ったのは、ドメイン モデルへの参照を削除し、ビューで必要なモデルのプロパティ (へのプレースホールド コメント) に置き換えることだけです。

コントローラーで、PrePoolOwner モデルをフェッチし、 AutoMapperを使用してそれをビュー モデルにマップします(これは架空の例であり、ビューが何をしているのかわかりません)。

public ViewResult Index(int id)
{
    PrePoolOwner entity = myservice.GetPrePoolOwner(id);

    PrePoolOwnerModel model = Mapper.Map<PrePoolOwnerModel>(entity);

    return View(model);
}

ここで、DateTime テキストボックスの問題に対処するには、MVC エディター テンプレートの使用を検討する必要があります (これはまったく別のテーマですが、Google でこのテーマをカバーする多くのトピックを見つけてください)。これにより、同様のタイプ (DateTime など) の要素をレンダリングするよりも柔軟性と再利用性が向上します。

ただし、それを使用する以外に、別のプロパティをモデルに追加し、AutoMapper を使用して DateTime を適切に設定することができます。したがって、コントローラーで次のようなものを使用すると、これを処理するために AutoMapper でマッピングを設定する必要があります。

public class PrePoolOwnerModel
{
    ....
    public String OglDateEffectiveValue { get; set; }
    ....
}

public ViewResult Index(int id)
{
    ....
    model.OglDateEffectiveValue = model.OglDateEffective.HasValue ? 
                                  model.OglDateEffective.Value.ToString("MM/dd/yyyy") : 
                                  String.Empty;
    ....
}

セットアップが完了したら、この新しいモデル プロパティ ( OglDateEffectiveValue) をテキスト ボックスの属性に使用できます。

ここで取り上げたことがたくさんあることは承知していますが、このようにビュー モデルをモデル化し、AutoMapper を使用してデータをビュー モデルにマップする必要があるのとまったく同じようにデータをビュー モデルにマッピングする方法を掘り下げて実験してください。

ビューのロジックを非常にシンプルに保ちます。オケージョン ループを超えてクレイジーなものを使用することは避けてください。

于 2012-11-13T21:55:23.680 に答える