如何使用相同的动作创建2个控制器2个视图但是一个实现

时间:2013-06-25 23:02:34

标签: c# asp.net-mvc

我的mvc应用程序中有一个控制器,如下所示。

public class BaseController: Controller
{
    protected void LogInfo()
    { 
        logger.InfoFormat("[SessionID: {0}, RemoteIP: {1}]", Session.SessionID,    Request.UserHostAddress); }
}

public class FirstController : BaseController
{

     public ActionResult Index(string name)
     {
        LogInfo();
        getQueryString();

        if(IsValidRec())
        {
            if(Errors()))
            {
               return View("Error");
            }

            var viewname = getViewName(name);
            return view(viewname);
        }
        else
            return view("NotFound"); 

     }
}

我需要使用FirstController具有的相同ActionResult方法创建另一个控制器(SecondController),但没有任何实现。因为我不会在2个ActionResult方法中重复相同的代码。

最好的方法是什么。我尝试了以下方式但是在初始化受保护的方法'LogInfo()'

时出现错误
public class SecondController : BaseController
{

     public ActionResult Index(string name)
     {
        var firstcontroller = new FirstController();
        return firstcontroller.Index(name); 
     }
}

4 个答案:

答案 0 :(得分:1)

将要重复使用的部件放在基本控制器中

e.g。

public class BaseController: Controller
{
    protected void LogInfo()
    { ... }

    virtual public ActionResult Index(string name)
    {
        LogInfo();
        getQueryString();
        .....

        var viewname = getViewName(name);
        return view(viewname);
    }
}

public class FirstController : BaseController
{
    override public ActionResult Index(string name)
    {
            var result = base.Index(name);
            .... do more stuff ...
            return result;
    }
}

public class SecondController : BaseController
{
    // Don't need to override index if you 
    // want to do the same as in the base controller
}

答案 1 :(得分:0)

你可以像这样使用继承(单向):

public abstract class MyControllerBase : Controller
{
  // whatever parameters
  protected SharedModel GetSharedModel()
  {
    // do logic
    // return model
  }
}

public class OneController : MyControllerBase
{
  protected ActionResult Index()
  {
    var model = this.GetSharedModel()

    return this.View(model);
  }
}

public class TwoController : MyControllerBase
{
  protected ActionResult Index()
  {
    var model = this.GetSharedModel()

    return this.View(model);
  }
}

答案 2 :(得分:0)

最好将常用功能放在应用程序的其他位置,并在两个控制器中使用它。就像我们以前编写帮助类或使用共享服务一样。从架构的角度来看,创建控制器实例并从中调用Action方法并不好。如果您仍有疑问......请详细说明您的常用功能......然后我将能够提供更多帮助。

答案 3 :(得分:0)

此类问题有两种解决方案:继承和组合。 通常,继承具有较少的代码,但灵活性较差。

这是more through discussion