0

我的 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

4 回答 4

1

将要重复使用的部分放入基本控制器中

例如

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
}
于 2013-06-26T01:06:21.163 回答
0

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

这是一个更深入的讨论

于 2013-06-26T22:24:12.100 回答
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);
  }
}
于 2013-06-25T23:49:56.643 回答
0

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

于 2013-06-26T05:55:41.760 回答