2009-05-06 3 views
1

ASP MVC 1.0에서 처리 할 복잡한 URL은 입니다. 대부분의 컨트롤러에서 수행해야하는 모든 작업에는 항상 계정과 프로젝트라는 두 개의 매개 변수가 필요합니다. 이것은 각 액션의 요구 사항 위에 있습니다. 이는 일반적인 URL은 다음과 같이 의미 :이 예에서ASP에서 복잡한 URL 처리 MVC

http://abcd.com/myaccount/projects/project_id/sites/edit/12 

: 내 계정 계정 이름입니다. 프로젝트은 컨트롤러 일 수 있으며, 다른 옵션은 위치입니다., 직원은입니다. 는 컨트롤러가 될 수 내 계정, 사이트 내 프로젝트의 ID입니다 PROJECT_ID, 다른 옵션 직원 또는 지불 같다. 편집은 조치이며 은 편집 된 사이트의 ID입니다.

이제 경로를 만들고 모든 작업에 두 개의 추가 매개 변수를 추가하여 project_id와 account를 컨트롤러의 모든 작업에 전달할 수 있습니다. 이것은 실제로 원하지 않으며 또한 두 컨트롤러 (프로젝트 및 사이트)가 여기서 작동 할 지 확신하지 못합니다.

필자의 이상적인 상황은 컨트롤러 동작 호출로 이동하고 project_id 및 myaccount를 거기에 저장하는 일종의 컨텍스트를 사용하는 것입니다. 나머지 매개 변수는 다음과 같은 일반적인 방법으로 처리 할 수 ​​있습니다.

// sitescontroller 
public ActionResult Edit(string id) 
{ 
string account = somecontext["account"]; 
string project_id = somecontext["project"]; 
// do stuff 
} 

어떻게/어디에서 발생 할 수 있습니까? 또한 ActionLink에서 어떻게 작동할까요? (예 :이 컨텍스트를 기반으로 올바른 링크 생성)

감사합니다.

답변

1

먼저 경로에 토큰을 추가해야합니다 (예 : {company}/projects/{project}{controller}/{action}/{id}). 그런 다음 자신의 IControllerFactory를 작성한 경우 생성자를 통해 RouteData에서 컨트롤러로 값을 푸시하는 것이 매우 쉽습니다. 아마도 가장 쉬운 방법은 DefaultControllerFactory를 서브 클래스 화하고 CreateController 메소드를 오버라이드하는 것입니다.

-1

이것은 나에게 의미가 없습니다. 왜 다음과 같은 경로가 있습니까?

{controller}/{id}/{controller}/{id} 

?

+0

이것을 보는 방법 중 하나입니다. 이는 Basecamp (37 신호)가 작동하는 방식과 정확히 같습니다. Basecamp에 계정을 만들면 다음과 같은 URL이 표시됩니다. http://accountName.basecamphq.com/projects/123/notes/345 ZenDesk도 정확히 동일합니다. (나는 GetSatisfaction이라고 생각한다). 내 요구 사항은 매우 비슷합니다. – Khash

+0

하지만 accountname은 컨트롤러가 아니라 컨트롤러가 필요로하지 않는 매개 변수이지만 응용 프로그램 자체는 페이지가 올바른 회사로 이동하도록합니다. John Downey가 제안한대로 할 수 있습니다. 우리는 부모 컨트롤러로 컨트롤러를 오버라이드하고 계정 이름 매개 변수를 효과적으로 캡쳐하고, 누가 누구인지, 어디로 가고 싶은지에 따라 다르게 표시/인증하는 방식으로 비슷한 위치에서 작업을 수행했습니다. –