我有一个名为search的partialview。我想在很多视图中提出这个局部视图。 目标是从搜索控制器获取搜索字符串输入并将其发送到使用搜索视图的父控制器。
通过这种方式,我想让搜索部分视图通用,以便我可以重复使用它。
SearchController:
[HttpPost]
public ActionResult Index(string searchString)
{
var controller = RouteData.Values.First().Value.ToString(); // this gives me "Search", which i dont want.
//here i want to take the parent controller name and redirect to that controller
return RedirectToAction("action", "controller", new { searchString = searchString });
}
任何人都可以帮我找到父控制器名称吗?
答案 0 :(得分:3)
您可以为控制器创建基类,并编写将在它们之间共享的代码,而不是使用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
}
您的部分视图“搜索”将定位当前控制器而不是“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 });
}
但是,使用基类是使这种特性具有通用性和可重用性的好方法。