2012-09-27 5 views
-1

HomeController에 Index라는 한 가지 방법이 있습니다. (Microsoft에서 제공하는 기본 템플릿 일뿐입니다.)mvc3에서 컨트롤러 actionresult 메서드를 재정의하는 방법?

public class HomeController : Controller 
    { 

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

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

이제 원하는 것은 ... Index 메서드를 재정의하는 것입니다. 아래처럼.

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 설계의 개방형 원리와 같은 기존 방법에는 수정을 원하지 않습니다. 가능하거나 불가능합니까? 또는 다른 방법이 있습니까?

+1

당신은 그렇게 할 수 없습니다 , 선언 된 동일한 클래스의 메소드를 대체하려고 시도하고 있습니다. 서브 클래스의 메소드 만 대체 할 수 있습니다. 같은 클래스의 메서드를 "오버라이드"하려면 이전 메서드 본문을 새 메서드로 바꿉니다. – verdesmarald

+0

이 작업을 수행 할 수 있다면/home/index를 방문 할 때 표시되는 결과는 무엇입니까? –

+0

@verdesmarald : 내가 하위 클래스를 만들었다 고 가정합시다. 그렇다면 어떻게 살아야할까요? –

답변

1

Controller은 일반적인 C# 클래스이므로 일반적인 상속 규칙을 따라야합니다. 같은 클래스에있는 메소드를 오버라이드하려는 경우, 그건 말도 안되기 때문에 컴파일되지 않을 것입니다. 기본 클래스의 방법은 virtual를 표시하는 경우

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

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

당신이 Foo의 서브 클래스가있는 경우

는, 당신은, 오버라이드 (override) 할 수 있습니다.

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

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

public class Foo2Controller : FooController 
{ 
} 

을 (. 서브 클래스가 메소드를 오버라이드 (override)하지 않는 경우에, 다음, 기본 클래스의 메소드가 불려 얻을 것이다) 그래서 다음과 같이 작동

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

그래서 집/인덱스를 요청하면 어떤 메소드가 호출 될까요? –

관련 문제