1

我有一个名为搜索的局部视图。我想把这个局部视图放在很多视图中。目标是从搜索控制器获取搜索字符串输入并将其发送到使用搜索视图的父控制器。

通过这种方式,我想使搜索局部视图通用,以便我可以重用它。

搜索控制器:

 [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 });
    }

谁能帮我找到父控制器名称?

4

1 回答 1

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
}

您的部分视图“搜索”将针对当前控制器而不是“搜索控制器”(通过不在您的视图中指定控制器名称),因此您的 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 });
}

但是使用基类是使这种特性通用且可重用的好方法。

于 2013-10-22T08:45:35.753 回答