2016-08-13 16 views
1

複雑なビューモデルを作成して更新することは、私がウェブプロジェクトに取り組んでいるときに大部分の時間を費やしていることです。ASP.NET MVCで複雑なビューモデルを作成する方法は?

    は例えば、私は今、2つのオプションを持って_Layout.cshtmlに渡す背景画像URLとページタイトルを取るPageViewModelので、他のすべてのビューモデルについては

    @model WebApplication.ViewModels.PageViewModel 
    
    <body [email protected]> 
        ... 
    </body 
    

    を得ました

  1. 特定のビューモデルを保持する(相続等オーバー組成物) PageViewModelのプロパティを作成し PageViewModel
  2. に由来します私は、GETアクションのために、私は今、私が実際に特定のアクションのために必要なビューモデルからプロパティとしてだけでなくPageViewModelからすべてのプロパティを初期化する必要がどのような場合にはオプション2の方がより傾いている明白な理由のために

、例えば

は、私には、災害のためのレシピです

public IActionResult Contact(int contactId) 
{ 
    ... 
    var viewmodel = new PageViewModel 
    { 
     BackgroundImageUrl = ..., 
     ContactViewModel = new 
     { 
     ... 
     } 
    } 
} 

のように作成されます。

物事は私が再構築する必要があり、理想的に、私は問題の行為に関連するフィールドだけを掲載しますので、それは何がPOSTアクションでうまくいかない場合は

public IActionResult Contact(ContactViewModel viewmodel) 
{ 
    if (ModelState.IsValid) 
    { 
     ... (this is the easy case) 
     return RedirectToAction(...) 
    } 

    ... (now we have a problem) 
} 

で、POSTでさえ悪化します上の例ではそれほど悪くないが、実世界のアプリケーションでは、これは非常に面倒です(ちょうど店からのデータでドロップダウンリストを設定すると思います)。コントローラの動作はリーンであると考えられていますか?ビューモデルに自分自身のデータを取得させる責任があるとは思わないので、おそらくビューモデルファクトリを用意する必要があります。それは順番に、厄介なものになる、それぞれのビューモデルのための1つの工場の過多を作り出すでしょう。

もっと良いアプローチがあるのでしょうか?

答えて

2

考えられる1つの可能性は、レイアウトの一部の部分を担当するchild actionを使用することです。

[ChildActionOnly] 
public ActionResult BackgroundImage() 
{ 
    var model = new MyViewModel 
    { 
     BackgroundImageUrl = ... 
    }; 
    return PartialView(model); 
} 

と、対応する部分図を持っている:例えば、あなたが背景画像URLを取り込むための責任を負うことになります、次の子の作用を有することができるように

することができ
@model MyViewModel 

<img src="@Model.BackgroundImageUrl" alt="" /> 

あなたのメインのレイアウトに含まれています(この場合、ビューモデルは必要ありません)。

<body> 
    @Html.Action("BackgroundImage", "SomeController") 
    ... 
</body> 

この方法を使用すると、ビューをレンダリングする主なアクションは、複雑なビューモデルを認識して組み立てる必要がありません。特定のビューモデルのみに焦点を当てます。

関連する問題