如何创建两个具有相同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);
}
}
将要重复使用的部件放入基本控制器
例如
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方法是不好的。。。从建筑学的角度来看。如果你还有疑问。。。请详细解释您的通用功能。。。那么我将能够提供更多帮助。
这类问题有两种解决方案:继承和组合。一般来说,继承的代码较少,但灵活性较差。
下面是一个更深入的讨论。