asp.net MVC 将继承控制器的操作重定向到通用基础控制器视图
asp.net MVC Redirect actions from inherited controllers to generic base controller views
我有一个被其他一些控制器继承的通用基础控制器。
这个请求 /InheritedController/{Action}
是否有可能重定向到 /Base/{Action}
?
或者应用程序是否会始终尝试重定向到 InheritedContoller/{Action}
,即使在执行了基本控制器中的代码之后也是如此?
您将路由与简单继承混淆了。路由框架相当简单。给定默认路由 {controller}/{action}/{id}
,它将从字面上找到一个具有该名称的控制器,将其新建,并尝试使用它拥有的任何其他请求数据调用其上的操作。它既不知道也不关心这个 class 是从一个基本控制器继承的。如果你想重定向到同名的基本控制器的操作,你需要在继承的控制器上重写这个方法来做重定向:
public class FooController : BaseController
{
public override ActionResult Bar()
{
return RedirectToAction("Bar", "Base");
}
}
public class BaseController
{
public virtual ActionResult Bar()
{
return View();
}
}
然后,当您转到 /Foo/Bar
时,您将被重定向到 /Base/Bar
。然而,重要的是,这意味着您的基础控制器必须能够自己实例化——它不能是抽象的。
不过,就其价值而言,仅从子级重定向到父级会让人质疑为什么您首先要继承。如果你想派人去行动 Base.Bar()
,那么只需使用 URL /Base/Bar
就可以了。
我有一个被其他一些控制器继承的通用基础控制器。
这个请求 /InheritedController/{Action}
是否有可能重定向到 /Base/{Action}
?
或者应用程序是否会始终尝试重定向到 InheritedContoller/{Action}
,即使在执行了基本控制器中的代码之后也是如此?
您将路由与简单继承混淆了。路由框架相当简单。给定默认路由 {controller}/{action}/{id}
,它将从字面上找到一个具有该名称的控制器,将其新建,并尝试使用它拥有的任何其他请求数据调用其上的操作。它既不知道也不关心这个 class 是从一个基本控制器继承的。如果你想重定向到同名的基本控制器的操作,你需要在继承的控制器上重写这个方法来做重定向:
public class FooController : BaseController
{
public override ActionResult Bar()
{
return RedirectToAction("Bar", "Base");
}
}
public class BaseController
{
public virtual ActionResult Bar()
{
return View();
}
}
然后,当您转到 /Foo/Bar
时,您将被重定向到 /Base/Bar
。然而,重要的是,这意味着您的基础控制器必须能够自己实例化——它不能是抽象的。
不过,就其价值而言,仅从子级重定向到父级会让人质疑为什么您首先要继承。如果你想派人去行动 Base.Bar()
,那么只需使用 URL /Base/Bar
就可以了。