2

同じドメイン オブジェクトを編集する 3 つのビューモデルがあります。AutoMapper を使用して、ドメイン オブジェクトからビューモデルにマップします。

得る

if (Roles.IsUserInRole("administrators"))
{
    viewName = "EditAdmin";
    editOrder = Mapper.Map<Order, ViewModels.Order.Admin_ViewModel>(order);
}
else if (Roles.IsUserInRole("administrators"))
{
    viewName = "EditTechnician";
    editOrder = Mapper.Map<Order, ViewModels.Order.Technician_ViewModel>(order);
}
else if (Roles.IsUserInRole("clients"))
{
    viewName = "EditClient";
    editOrder = Mapper.Map<Order, ViewModels.Order.Client_ViewModel>(order);
}

RedirectToRoute(viewName, editOrder);

POST すべてのビューモデルに同じ方法を使用することは可能ですか? おそらくViewModelに「ViewModelbase」から継承させることでしょうか?これを試してみましたが成功しませんでした:(

よろしくお願いします!

編集:これは私の方法が今のように見えるものです:

public ActionResult EditAdmin(ViewModels.Order.Admin_ViewModel model) {...}

何か案は?

更新: コンポジションの使用方法を理解できませんでした (数時間試しました)。だから私はこれを使って少しきれいにしました。これらは、私の 3 つのビューモデルのハンドラーです。

[HttpPost]
[Authorize(Roles = "administrators")]
public ActionResult EditAdmin(Admin_ViewModel model)
{
    return SaveViewModel(model);
}

[HttpPost]
[Authorize(Roles = "technicians")]
public ActionResult EditTechnician(Technician_ViewModel model)
{
    return SaveViewModel(model);
}

[HttpPost]
[Authorize(Roles = "clients")]
public ActionResult EditClient(Client_ViewModel model)
{
    return SaveViewModel(model);
}

SaveViewModel は次のようになります。

protected ActionResult SaveViewModel(dynamic model)
{ ... }

私はこの解決策についてあまり気分が良くありません。いくつかの指針を教えてください。

4

1 に答える 1

1

IMHO-ViewModelはわかりやすくシンプルなものにする必要があります。継承を導入すると、複雑になります。

コンポジションを使用して、必要なViewModelを構築することをお勧めします。したがって、ユーザーが特定のロールに属している場合、ページが投稿されるときに、ロールに関連しないオブジェクトはnullになります。これにより、多数ではなく1つのPOSTメソッドに固執することができます。

更新: ViewModelで本当に継承したい場合。デフォルトのバインダーが機能しない場合は、カスタムモデルバインダーが解決策です

于 2012-05-09T13:26:46.670 に答える