1

エディター画面をリファクタリングしようとしています。編集者のモデルはドメインモデルでした。ユーザーが特定の役割を持っている場合にのみいくつかのフィールドの編集を許可する必要があるため、この画面のビューモデルに移動します。モデルの作成と編集の両方に同じエディタービューを使用したいのですが、それは私の問題の一部かもしれません。

SOに関する他の場所で、ビューモデルは単純化する必要があることを読んだので、ビューモデルのインターフェイス階層のようなものは必要ありません。ただし、2つの異なるビューモデルに同じ強い型のビューを使用するにはどうすればよいですか。1つは作成用、もう1つは編集用です。ビューモデルには、ユーザーの役割に応じてほぼ同じですがわずかに異なるプロパティがあります。

これは、私が作成した2つのビューモデルを使用した簡単な例です。

public class RequirementCreateView
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Justification { get; set; }
    public string ImpactIfNotFunded { get; set; }
    ... etc for about 40 properties ...
}

public class RequirementEditView
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Justification { get; set; }
    public string ImpactIfNotFunded { get; set; }
    public string Decision { get; set; }
    public string Status { get; set; }
    ... etc for about 40 properties ...
}

2つのビューモデルは同じですが、編集モデルには、適切な役割を持つユーザーのみが設定できる2つの追加プロパティDecisionStatusがあります。AutoMapperを使用して、ドメインRequirementオブジェクトからビューモデルにマップし、その逆を作成/更新アクションに使用します。

ただし、2つのビューモデルがあるので、ValidationMessageFor(m => Model.Name)のようなものが機能しないため、1つの厳密に型指定されたエディター画面を使用することはできません。そのため、次のように、この一連のビューモデルのインターフェイス階層を検討することになりました。

IRequirementEditorView             -->  common properties
    |--> IRequirementCreateView    -->  create-specific properties (none right now)
    |--> IRequirementEditView      -->  edit-specific properties

次に、エディタービュー画面参照IRequirementEditorViewを用意します。しかし、繰り返しになりますが、これは単純化されたビューモデルに関する現在の知恵に反します。しかし、別の方法は、DRYに違反するエディター画面を複製することです。

これは明らかに一般的な問題ですが、私は今困惑しています。何かアドバイス?

ありがとう。

編集他の非常によく似た投稿を見た後で明確にする必要があります。「同じ」エディタービュー画面を使用していると言うときは、Create.cshtmlとEdit.cshtmlの2つの別々のビューを使用しています。これらのそれぞれは、次のように実際のエディターフォームを含む部分ビューを参照するだけです。

@Html.Partial("Controls/RequirementEditor", Model, ViewData)

これは、ドメインオブジェクトをビューモデルとして使用していたときに使用したものです。

4

1 に答える 1

0

これには別の考え方があったことがわかりました。この質問を投稿した直後に、いくつかの変更を加えましたが、結果には非常に満足しています。これが私がしたことです:

  1. ビュー モデルに追加の bool プロパティ AllowDecisionEdit および AllowStatusEdit が追加されました。

  2. ビュー モデルには、DecisionsList と StatusList の 2 つの新しい IEnumerable プロパティがあります。

  3. 1 と 2 はコントローラーに取り込まれ、適切なビュー (作成または編集) に渡されます。

  4. create ビューは Html.BeginForm() を呼び出し、次に部分的な Html.Partial("Controls/RequirementEditor/Editor") を呼び出します。編集ビューは同じことを行いますが、部分呼び出しの前に Html.HiddenFor(m => Model.Id) を追加して、編集フォームが適切に機能するようにします。

これで、1 つの編集モデル、1 つのエディター部分フォーム、2 つの別個のビュー (作成と編集) があり、それぞれが同じ部分エディターと同じエディターを使用し、コントローラーで機能をオンまたはオフにできます。上記の私のアプローチは非常に悪臭を放ち、どちらにも満足できませんでした. これを行うと、すべてが世界に合っていると感じました。:)

于 2013-01-15T15:58:43.867 に答える