您可以爲您的控制器創建一個基類並編寫將在它們之間共享的代碼,而不是使用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
}
你partialview「搜索」將針對電流控制器,而不是「SearchController」(由沒有在你的視圖中指定控制器名稱),所以你的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 });
}
但是去基類是一種很好的方式來使這種功能通用和可重用。
您是否使用ajax將「searchString」發佈到SearchController? – Harminder
是... Ajax.Beginform – kandroid