2012-09-27 36 views
-1

在HomeController中有一種稱爲索引的方法。 (這只是微軟提供的默認模板)如何覆蓋mvc3中的controller actionresult方法?

public class HomeController : Controller 
    { 

     public ActionResult Index() 
     { 
      ViewBag.Message = "Welcome to ASP.NET MVC!"; 
      return View(); 
     } 

     public ActionResult About() 
     { 
      return View(); 
     } 
    } 

現在我想要的是... override指數方法。像下面的東西。

public partial class HomeController : Controller 
    { 

     public virtual ActionResult Index() 
     { 
      ViewBag.Message = "Welcome to ASP.NET MVC!"; 
      return View(); 
     } 

     public ActionResult About() 
     { 
      return View(); 
     } 

     public override ActionResult Index() 
     { 
      ViewBag.Message = "Override Index"; 
      return View(); 
     } 

    } 

我不想在OO設計中使用Open-Closed原理等現有方法進行修改。 可能嗎?還是有另一種方式?

+1

你不能這樣做,你正在試圖覆蓋它所聲明的同一個類中的方法。你只能覆蓋子類中的方法。如果您想在同一個類中「覆蓋」該方法,只需將舊方法體替換爲新方法體即可。 – verdesmarald

+0

如果你能做到這一點,訪問/ home/index時顯示結果是什麼? –

+0

@verdesmarald:讓我們假設我已經創建了子類。那麼如何存檔? –

回答

1

A Controller是一個普通的C#類,所以你必須遵循正常的繼承規則。如果你試圖在同一個類中重寫一個方法,這是無稽之談,不會編譯。

public class FooController 
{ 
    public virtual ActionResult Bar() 
    { 
    } 

    // COMPILER ERROR here, there's nothing to override 
    public override ActionResult Bar() 
    { 
    } 
} 

如果你有Foo子類,那麼你可以重寫,如果在基類中的方法標記virtual。 (而且,如果子類沒有覆蓋的方法,然後在基類中的方法將被調用。)

public class FooController 
{ 
    public virtual ActionResult Bar() 
    { 
     return View(); 
    } 
} 

public class Foo1Controller : FooController 
{ 
    public override ActionResult Bar() 
    { 
     return View(); 
    } 
} 

public class Foo2Controller : FooController 
{ 
} 

所以它的工作原理是這樣的:

Foo1 foo1 = new Foo1(); 
foo1.Bar();    // here the overridden Bar method in Foo1 gets called 
Foo2 foo2 = new Foo2(); 
foo2.Bar();    // here the base Bar method in Foo gets called 
+0

所以你打算說我應該創建另一個控制器,並用現有的HomeController繼承它? –

+0

@DharmikBhandari確實如此。 – McGarnagle

+0

所以當我請求home/index時,會調用什麼方法? –