2012-09-25 2 views
2

asp.net net mvc4 및 javascript를 사용하여 단일 페이지 응용 프로그램을 작성합니다.ASP.NET MVC 4의 단일 페이지 응용 프로그램 경로

내 자바 스크립트에는 자체 라우팅 엔진이 있으므로 루트 아래의 모든 경로를 자바 스크립트로 처리하고 모든 경로를 api 아래 서버 측에서 처리하도록하고 싶습니다. 즉 : 그러나

/    <--- javascript handles 
/api   <--- ASP.NET MVC handles 

, 나는이 노선을 처리하지 ASP.NET MVC를 구별하는 방법에의 단서를 가지고 있지 않으며, 내가 지금까지 시도도 실행되지 않습니다

 routes.MapRoute(
      name: "Client", 
      url: "/", 
      defaults: new { controller = "Home", action = "Index", } 
     ); 

     routes.MapRoute(
      name: "API", 
      url: "api/{controller}/{action}/{id}", 
      defaults: new { controller = "Tasks", action = "Index", id = UrlParameter.Optional } 
     ); 

모든 아이디어를 환영합니다. 감사합니다!

+1

MVC의 경우 라우팅의 의미를 잘 모르겠습니다. MVC는 적어도 기본 기본 경로 (그리고 WebApi를 사용하는 경우 Api 경로)를 사용해야합니다. 라우팅 엔진은 MVC가 url을 기반으로 올바른 컨트롤러를 만들 수 있도록 해줍니다. MVC는 작동하지 않습니다. JavaScript가 MVC를 위해이 함수를 처리 할 방법이 없습니다. –

+3

그의 질문이 합리적이었습니다. 클라이언트 측 라우팅은 SPA가 실행되는 동안 모든 경로 변경 *을 가로 채고 처리하지만 사용자가 링크 중 하나를 북마크하고 나중에 되돌릴 수 있습니다. 그런 경우 서버 측 라우팅을 올바른 클라이언트 측 경로를 제공 할 수 있도록 SPA를 다시로드 할 수 있도록 배선해야합니다. 그렇지 않으면 작동하지 않습니다. – blaster

답변

12

catch-all 매개 변수를 사용하지 않으면 경로 URL에 존재하지 않는 매개 변수의 기본값을 가질 수 없습니다. 캐치 올 (catch-all) 경로에 의해 소비되지 않도록 API 경로를 먼저 만들어야합니다.

routes.MapRoute(
    name: "API", 
    url: "api/{controller}/{action}/{id}", 
    defaults: new { controller="Tasks", action="Index", id=UrlParameter.Optional } 
); 

routes.MapRoute(
    "Default", // Route name 
    "{*catchall}", // URL with parameters 
    new { controller = "Home", action = "Index" } // Parameter defaults 
); 

갱신 :이 경우에 것을 언급해야한다, .NET MVC는 여전히 귀하의 경우의 진입 점을 제공한다 "홈/색인,"에게 "API"를 일치하지 않는 모든 요청을 전달됩니다 클라이언트 측 MVC 프레임 워크.

+0

정적 리소스가 라우트에 의해 차단되고 있으면 해당 호출에 대한 index.html 페이지도 반환됩니다. 어떻게이 문제를 해결할 수 있을까요? – WarrenDodsworth

+0

모든 것을 처리하는 단일 catch-all 대신 각 컨트롤러에 하나씩 여러 "catch-all"경로가 필요할 것입니다. 예를 들어,'Views/Home','Views/Foo','Views/Bar','HomeController','FooController','BarController'를 가지고 있다면, '/ Home','/ Foo','/ Bar'를 포함하는 호출을 처리하는 컨트롤러입니다. 어떤 컨트롤러도 정적 리소스에 대한 경로와 충돌하지 않는 한 (예 : 정적 파일이'/ Content'에있을 경우'Views/Content'가 없으면 괜찮을 것입니다. . – Isochronous

관련 문제