您可以为您的控制器创建一个基类并编写将在它们之间共享的代码,而不是使用 SearchController。如果多个控制器需要您的功能,这是有道理的。
假设您的控制器有一个基类:
public class BaseController : Controller
{
[HttpPost]
public ActionResult Search(string searchString)
{
// ... some process
return RedirectToAction("SomeAction", new { searchString = searchString });
}
public virtual ActionResult SomeAction(string searchString)
{
// ... some other process
}
}
然后是您的特定控制器:
public class MyController : BaseController
{
public override ActionResult SomeAction(string searchString)
{
// ... again some process
}
// .. some other actions
}
您的部分视图“搜索”将针对当前控制器而不是“搜索控制器”(通过不在您的视图中指定控制器名称),因此您的 RedirectToAction 还将重定向到该控制器的操作,而无需获取他的名称(这就是没有控制器的原因上面代码截图中的名称)。
如果您需要根据当前控制器的不同命名(它可以成为另一个参数,沿着 searchString 参数),您也可以传递一个字符串变量作为操作名称,而不是使用虚拟方法:
public class BaseController : Controller
{
[HttpPost]
public ActionResult Search(string searchString, string targetAction)
{
// ... some process
return RedirectToAction(targetAction, new { searchString = searchString });
}
}
如果您不想使用基类,在触发搜索功能之前,您始终可以在视图中获取当前控制器名称:
@HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString()
在您的控制器中,它变为:
[HttpPost]
public ActionResult Search(string searchString, string controllerName)
{
// ... some process
return RedirectToAction("action", controllerName, new { searchString = searchString });
}
但是使用基类是使这种特性通用且可重用的好方法。