2011-03-16 52 views
2

美好的一天!ASP.NET MVC 2中的相同動作的不同視圖 - 我應該繼承控制器嗎?

我有一個應用程序,我需要顯示和處理兩種不同的HTML表單 - 一個用於普通頁面,一個用於站點範圍的母版頁,另一個用於包含不同設計設計(HTML代碼)的其他主頁頁。

現在我有控制器與正常頁面的幾個操作和視圖,是時候創建iframe版本。表單域,驗證和處理是完全相同的,所以我想盡可能地使它乾燥。

是否有可能繼承控制器(不添加任何新的東西),以便能夠創建新的視圖?

namespace MyControllers 
{ 
    public class SomeController : BaseController 
    { 
     [HttpGet] 
     public ActionResult ProcessMyForm() 
     { 
      ... 
     } 

     [HttpPost] 
     public ActionResult ProcessMyForm(FormCollection form) 
     { 
      ... 
     }  
    } 
} 

意見將在/Views/MyController

namespace MyControllers 
{ 
    public class SomeControllerWithDifferentViews : SomeController 
    { 
     // nothing here 
    } 
} 

不同的意見將在/Views/SomeControllerWithDifferentViews

是否有意義?

回答

4

您可以嘗試將查詢參數傳遞給您的ActionResult處理程序以知道要提供哪個視圖。

[HttpPost] 
public ActionResult ProcessMyForm(FormCollection form, bool isIFrame) 
{ 
    ...snip... 

    if (isIFrame) 
    { 
    return View ('MyFormIFrame') 
    } 
    else 
    { 
    return View ('MyForm'); 
    } 
} 

如果你想不同的路由映射到該處理程序,你可以做以下

routes.MapRoute ("MyForm", "/mycontroller/action", new 
{ 
    Controller = "mycontroller", 
    Action = "ProcessMyForm", 
    isIFrame = false, 
}); 


routes.MapRoute ("MyFormIFrame", "/mycontroller/action-iframe", new 
{ 
    Controller = "mycontroller", 
    Action = "ProcessMyForm", 
    isIFrame = true, 
}); 
+0

感謝您的提示,我可以把這個參數放在自定義的URL重寫規則定義中,例如我會將'/ mycontroller/action-iframe'和'mycontroller/action'作爲傳入的URL? – artvolk 2011-03-18 07:55:54

0

是的,這應該在使用默認視圖引擎時工作,假設您有基本和派生控制器類型的視圖文件。

1

是否可以繼承控制器(不添加任何新的東西給它) 能夠創建新的視圖?

是的。

但是,請記住,在ASP.NET MVC中,視圖和控制器沒有綁定在一起。您可以讓兩個完全不同的控制器提供相同的視圖(只要您將正確的ViewModel傳遞給視圖)。這意味着您不一定需要從同一個控制器繼承,才能使用來自多個控制器的視圖。你可以,如果它是有道理的,但你不必。

相關問題