문제

간단한 사이트를 만들려고합니다. 기본적으로 하나의 컨트롤러가 있습니다 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'코드가 가능합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top