如何创建两个具有相同actionresult的控制器两个视图只有一个实现

本文关键字:两个 控制器 视图 有一个 实现 actionresult 何创建 创建 | 更新日期: 2023-09-27 18:19:58

我在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),但没有任何实现。因为我不习惯在两个ActionResult方法中重复相同的代码。

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

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

如何创建两个具有相同actionresult的控制器两个视图只有一个实现

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

例如

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
}

您可以这样使用继承(一种方式):

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);
  }
}

最好将通用功能放在应用程序的其他地方,并在两个控制器中使用。就像我们过去写助手类或使用共享服务一样。创建控制器的实例并从中调用Action方法是不好的。。。从建筑学的角度来看。如果你还有疑问。。。请详细解释您的通用功能。。。那么我将能够提供更多帮助。

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

下面是一个更深入的讨论。