我的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);
}
}
答案 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)
此类问题有两种解决方案:继承和组合。 通常,继承具有较少的代码,但灵活性较差。