2013-10-22 18 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

"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

관련 문제