2009-03-05 5 views
1

複数のビューで1つのコントローラを使用してMVCアプリケーションを作成しようとしています。私は別のプロパティを持つ第2のルートを作成して、それを第2のフォルダにリダイレクトすることから始めました。複数のビューを持つシングルコントローラ

 public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "xml",            // Route name 
      "xml/{controller}/{action}/{id}",       // URL with parameters 
      new { mode = "xml", controller = "Home", action = "Index", id = "" } // Parameter defaults 
     ); 

     routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
     ); 
    } 
    protected void Application_Start() 
    { 
     RegisterRoutes(RouteTable.Routes); 
     SessionManager.Instance.InitSessionFactory("acstech.helpWanted"); 
     ViewEngines.Engines.Clear(); 
     ViewEngines.Engines.Add(new ModeViewEngine()); 
    } 

その後、WebFormViewEngineから降りて、〜/ Viewから〜/ {mode} Viewにパスを変更しました。これは正しく動作し、ページを適切にレンダリングしました。私が遭遇した問題は、Html.ActionLinkがビューのレンダリングに関係なく常にモードバージョンを使用することです。これは私の目標を達成するための正しい方向です。もしそうなら、アクションリンクを適切に働かせるために何が欠けていますか?以下はViewEngineです。これは実験室のテストなので、いくつかの自由が取られています。

public class ModeViewEngine : WebFormViewEngine 
{ 
    public ModeViewEngine() 
    { 

    } 

    protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath) 
    { 
     string mode = String.Empty; 
     if (controllerContext.RouteData.Values["mode"] != null) 
      mode = controllerContext.RouteData.Values["mode"] as string; 
     return new WebFormView(partialPath.Replace("~/Views", "~/" + mode + "Views"), null); 
    } 

    protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath) 
    { 
     string mode = String.Empty; 
     if (controllerContext.RouteData.Values["mode"] != null) 
      mode = controllerContext.RouteData.Values["mode"] as string; 
     return new WebFormView(viewPath.Replace("~/Views", "~/" + mode + "Views"), masterPath); 
    } 
} 

答えて

0

なぜコントローラはモードに基づいて別のビューを選択してもらえませんか?その後、ホームビューまたはHome_Xmlを返すことができます。

私はこの決定をコントローラから外してロジックを集中させると思いますが、それぞれのモードで一致するビューを作成する必要があります。

+0

それはうまくいくと私は基本ApplicationControllerを作成することによってビューを集中することができますが、2つの別々のビュー構造を持つことが欲しいです。 – Thad

0

Asp.Netフレームワークの素晴らしい点は、それが非常に拡張性があることです。私はあなたがこのリンクをチェックアウトするべきだと思います。それはまさにあなたが探しているものを持っています。私のopionは、著者と共にActionFilterを作成し、XMLやJSONビューを必要とするコントローラでビューを飾ることです。私は、XMLへのすべてのシリアライゼーションがFilterで発生し、それが返され、ViewEngineを必要としないケースも見てきました。

http://jesschadwick.blogspot.com/2008/06/aspnet-mvc-using-custom-view-engines.html

1

あなたはデフォルトルートでデフォルトの列に「」=モードを追加したことがありますか?つまり、私が理解しているように、「インデックス」アクションがURLからどのように省かれるのか、理論的にはあなたのデフォルトルートと一致するはずです。

関連する問題