0

Razor を使用して ASP.Net MVC アプリケーションを作成しています。

HomeController とそのためのいくつかのビューがあるとします。

 1. View1
 2. View2
 3. View3

このすべてのビューは、次のような共通_MyLayoutファイル を使用します。

リンクがクリックされると、メソッドによってビューがレンダリングされますRenderBody()。各ビューは厳密に型指定されています。独自のモデルが必要です。

特別なモデルを _MyLayout ビューに追加することを決定するまで、すべて問題ありませんでした。

しかし、今私はエラーが発生します

The model item passed into the dictionary is of type 'TestUp.Models.UserModels.PendingTestsModel', but this dictionary requires a model item of type 'TestUp.Models.UserModels.UserNavigationModel'.

ここにコントローラーコードがあります

public ActionResult View1()
    {
        ModelForView1 model = new ModelForView1();
        return View(model);
    }
public ActionResult View2()
    {
        ModelForView2 model = new ModelForView2();
        return View(model);
    }
public ActionResult View3()
    {
        ModelForView3 model = new ModelForView3();
        return View(model);
    }

簡単に言えば、レイアウトビューがモデルを必要としない場合、ビューの特定のメソッドが呼び出され、モデルが作成され、ビューに渡され、すべて問題ありません。しかし、現在、レイアウトにはモデルも必要であるため、クラッシュします。

問題は、この問題をエレガントに解決するにはどうすればよいかということです。

望ましいワークフローは次のとおりです。

  1. View1 が要求されました
  2. このビューのコントローラーのメソッドが呼び出され、モデル インスタンスが作成され、ビューに渡されます
  3. レイアウト用の何らかのメソッドが呼び出され、レイアウト用のモデルが作成され、レイアウトに渡されます。

どういうわけかこのように物事を機能させることは可能ですか?

ありがとう。

4

1 に答える 1

1

基本モデル タイプを作成し、特定のビュー モデルにそれを拡張させます。この基本モデルは、 type のプロパティを持つことができますUserNavigationModel。レイアウトは基本モデルを受け入れ、新しいプロパティをナビゲーション メニューのモデルとして使用できます。

public abstract class ModelBase
{
    public UserNavigationModel NavigationModel { get; set; }
}

public class ModelForView1 : ModelBase { ... }
public class ModelForView2 : ModelBase { ... }
public class ModelForView3 : ModelBase { ... }

ビュー 1:

@model ModelForView1

レイアウト:

@model ModelBase
@* use Model.NavigationModel for nav bar *@

于 2013-01-27T16:38:01.340 に答える