2013-10-22 82 views
1

我有一個稱爲搜索的partialview。我想從很多角度來看這個部分觀點。 目標是從搜索控制器接收搜索字符串輸入並將其發送到使用搜索視圖的父控制器。從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

您是否使用ajax將「searchString」發佈到SearchController? – Harminder

+0

是... Ajax.Beginform – kandroid

回答

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 
} 

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

但是去基類是一種很好的方式來使這種功能通用和可重用。

+0

嘿..感謝很多..我會盡快嘗試你的建議..讓你知道 – kandroid

相關問題