How can I inherit an ASP.NET MVC controller and change only the view?

asp.net-mvc

Solution

Based on the feedback given on this thread, I've implemented a solution like the one proposed by Antony Koch.

Instead of using an abstract method, I used a concrete, virtual GetIndex method so that I could put logic in it for the base controller.

public class SalesController : Controller
{
    // Index view method and model
    public virtual ActionResult GetIndex()
    {
         return View("Index", IndexModel);
    }
    protected TestModel IndexModel { get; set; }

    public virtual ActionResult Index()
    {
        ViewData["test"] = "Set in base.";

        IndexModel = new TestModel();
        IndexModel.Text = "123";

        return GetIndex();
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public virtual ActionResult Index(TestModel data, FormCollection form)
    {
        TryUpdateModel(data, form.ToValueProvider());
        IndexModel = data;

        return GetIndex();
    }
}

// This class will need to be in a different namespace or named differently than the
// parent controller
public class SalesController : MyApp.Controllers.BaseControllers.SalesController
{
    // Index view method and model
    public override ActionResult GetIndex()
    {
        return View("ClientIndex", IndexModel);
    }

    public override ActionResult Index()
    {
        return base.Index();
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public override ActionResult Index(TestModel data, FormCollection form)
    {
        return base.Index(data, form);
    }
}

Problem

I have a controller that's inheriting from a base controller, and I'm wondering how I can utilize all of the logic from the base controller, but return a different view than the base controller uses. The base controller populates a model object and passes that model object to its view, but I'm not sure how I can access that model object in the child controller so that I can pass it to the child controller's view.

Original source