단일 컨트롤러 사이트의 ASP.NET MVC 라우팅
-
05-07-2019 - |
문제
간단한 사이트를 만들려고합니다. 기본적으로 하나의 컨트롤러가 있습니다 Home
제어 장치.
이 컨트롤러에는 작업이 있습니다 Index
a string
인수 (디렉토리)로서 해당 '디렉토리'를 사용하여 작업을 수행합니다.
모든 URL을이 작업에 보낼 모든 경로를 만드는 방법을 해결할 수는 없습니다.
모든 URL 조합이 존재할 수 있으며 도메인 이름을 넘어서는 모든 것이 문자열이어야합니다.
http://<domain>/2008
http://<domain>/2008/09
http://<domain>/2008/09/Fred
누구 든지이 작업을 수행하는 방법을 아는 사람이 있습니까? 모든 값이 목록으로 전달되면 괜찮을 것입니다.
더 좋은 방법이 있습니까?
해결책
이 시도 :
routes.MapRoute(
"Default", "{*path}",
new { controller = "Home", action = "Index" }
);
그리고 컨트롤러 :
public class HomeController : Controller {
public ActionResult Index(string path) {
return View();
}
}
다른 팁
나의 첫 번째 생각은 그것이 '나쁜 생각'입니다. 당신이 할 수 있다면 아무것 그들은 URL을 위해 당신을 던질 수 있습니다. 당신은 블랙리스트 (또는 화이트리스트)가 있어야합니다. 오프닝이 너무 많습니다. 더 나은 방법은 이러한 경로와 매개 변수를 허용하는 방법을 명시 적으로 철자 한 다음 수용된 경로를 다루는 조치를 취하는 것입니다. 그런 다음 오류 페이지로 리디렉션되는 일반적인 캐치 모든 경로가 있습니다.
사과와 오렌지를 섞으려고하는 것 같습니다. ASP.NET MVC는 의도적으로 '페이지'아이디어를 사용합니다. 파일 I/O를 수행하지 않는 한 다양한 사용자를위한 디렉토리를 가질 이유가 없으며,이 경우 ASP.NET MVC 패러다임에서 생각보다 훨씬 쉽게 작업 할 수 있습니다.
ASP.NET MVC에서 전달 된 문자열 (통과 한 문자열과 마찬가지로)을 기준으로 원하는 정보를 변경하려면 다음을 수행하는 '안전한'방법이 있습니다.
방법 #1- 세 개의 경로, 세 가지 동작, 다른 이름
routes.MapRoute(
"YearOnly",
"{year}",
new { controller = "Index", action = "ShowByYear" },
new { year = @"\d{4}" }
);
routes.MapRoute(
"YearAndMonth",
"{year}/{month}",
new { controller = "Index", action = "ShowByYearAndMonth" },
new { year = @"\d{4}", month = @"\d{2}" }
);
routes.MapRoute(
"YearMonthAndName",
"{year}/{month}/{name}",
new { controller = "Index", action = "ShowByYearMonthAndName" },
new { year = @"\d{4}", month = @"\d{2}" }
);
그런 다음 컨트롤러 작업에서 전달 된 경로 값을 사용하여 데이터를 보는 방법을 결정합니다.
ShowByYear(string year)
{
//Return appropriate View here
}
ShowByYearAndMonth(string year, string month)
{
//Return appropriate View here
}
ShowByYearMonthAndName(string year, string month, string name)
{
//Return appropriate View here
}
방법 #2- 제안 된 방법
routes.MapRoute(
"YearOnly",
"{year}",
new { controller = "Index", action = "Show" },
new { year = @"\d{4}" }
);
routes.MapRoute(
"YearAndMonth",
"{year}/{month}",
new { controller = "Index", action = "Show" },
new { year = @"\d{4}", month = @"\d{2}" }
);
routes.MapRoute(
"YearMonthAndName",
"{year}/{month}/{name}",
new { controller = "Index", action = "Show" },
new { year = @"\d{4}", month = @"\d{2}", name = "" }
);
Show(string year)
{
//
}
Show(string year, string month)
{
//Return appropriate View here
}
Show(string year, string month, string name)
{
//Return appropriate View here
}
이 접근법의 아름다움은 MapRoute
URL 파싱 처리; 그리고 Riff Raff를 유지합니다. 그런 다음 오류를 던지는 캐치-모든 경로를 설정할 수 있습니다. 당신은 오히려 경로 쪽에서 몇 가지 구문 분석을 할 것입니다. regex
당신의 컨트롤러보다 (내 의견으로는).
이를 통해 3 개의 과부하 작업으로 유지되며 더 깨끗하고 더 많은 'MVC'코드가 가능합니다.