tekitoumemo’s diary

思ったことを書くだけ。長文版Twitter

【ASP.NET MVC,C#】一つのメソッドで複数のViewを切り替える方法

以前書いた記事の応用編です。


同じようなロジックなんだけど、ビューのデザインや表示する値を変えれば便利だなーと思うときがあります。今回は受け取ったパラメータから表示するビューを切り替えたり、ViewModelを変えたりする方法を紹介します。参考用にgithubに上げております。

以前記事に書いた戻り値のViewメソッドに表示したいパスを指定します。

public ActionResult Index()
{
  return View("~/Views/Home/Hoge.cshtml");
}

Indexメソッドで表示するViewがHoge.cshtmlになります。パラメータ毎に表示を変える場合は以下の書きます。

public ActionResult Index(string id = "")
{
       return View(string.Format("~/Views/Home/{0}.cshtml", id));
}

以前書いた記事の内容と全く同じです。idとViewの名前が一致しない場合も応用出来ます。

ASP.NET MVCはモデルをViewに渡すことが出来ますのでView()メソッドの第二引数にモデルを指定しましょう。

public ActionResult Index(string id = "")
{
       var model = new IndexViewModel();
       return View(string.Format("~/Views/Home/{0}.cshtml", id),model);
}

View側には受け取るためのモデルを指定します。

@inherits System.Web.Mvc.WebViewPage<SwitchViews.Models.IndexViewModel>

さらにパラメータなどによってViewもモデルも切り替えたい場合があります。

        public ActionResult Index(string id = "")
        {
            if (id.Equals("foo"))
            {
                return View(string.Format("~/Views/Home/{0}.cshtml", id), new Models.FooViewModel());
            }
            else if (id.Equals("bar"))
            {
                return View(string.Format("~/Views/Home/{0}.cshtml", id), new Models.BarViewModel());
            }
            return View(new Models.IndexViewModel());
        }

idがfooだったら

idがbarだったら

と条件によってViewもモデルも切り替えられます。

このような方法はHTMLヘルパーのActionやPartialなどにも使えますので自由度増して便利です。ただし、多様すると何のメソッドなのかよく分からなくなってしまうので使いどころは考えた方が良さそうです。