我有一个名为BaseController
的控制器。在BaseController中,我有一个名为Index
的Action方法,它有一些逻辑,包括查询路由和构建URL。有点像:
var link = Url.RouteUrl("myroute", new { id = 5 });
所有这一切都很好,直到我创建一个扩展BaseController的控制器NewController
。在NewController的构造函数中,我将BaseController作为依赖项传递。
public class NewController
{
private BaseController _baseController;
public NewController(BaseController baseController)
{
_baseController = baseController;
}
public ActionResult Index()
{
return _baseController.Index();
}
}
为什么需要这样做是因为我需要覆盖视图(一些HTML和CSS更改)。我不想重新创建模型和服务并重写业务逻辑,所以认为这将是最好和最有效的方法。
唯一的问题是在调用BaseController的索引操作时,Url
显然为空。路由数据不可用,因为请求是在基本控制器之外生成的。
解决这个问题的最佳方法是什么?
答案 0 :(得分:0)
您正尝试从另一个控制器调用操作方法。您的构造函数方法可以将baseController作为null。你能尝试像下面那样实现它吗
public ActionResult Index()
{
return new BaseController().Index(); // assume you call index action
}
或者你可以从另一个控制器调用BaseController动作,如下面的
public ActionResult Index()
{
return RedirectToAction("Index", "Base"); // assume you call index action
}
您还可以更改路线网址,如下所示。
@Url.RouteUrl("myroute", new { controller = "Base", action = "Index", id = 5 })
答案 1 :(得分:0)
让BaseController.Index()
虚拟:
public class BaseController : Controller
{
public virtual ActionResult Index()
{
return View();
}
}
然后使用继承:
public class NewController : BaseController
{
public override ActionResult Index()
{
var index = base.Index();
//do whatever
return index;
}
}
答案 2 :(得分:0)
我有另一种解决方案需要一些代码设计工作。
为什么你抽象你的业务逻辑远离两个Controllers
?
例如:RouteBuilder.cs
一个具有包含构建路由逻辑的函数的类。
BaseClass.cs
是一个包含两个控制器之间共享逻辑的类。
,然后强>
public class BaseController
{
public ActionResult Index()
{``
//Instantiase BaseClass.cs and call the needed functions. Then RouteBuilder.cs and call functions.
return View();
}
}
public class NewController
{
public ActionResult Index()
{``
//Instantiase BaseClass.cs and call the needed functions.
return View();
}
}
中提琴。解决了问题并生成了干净的代码。