2012-12-16 2 views
2

을 제거ASP.NET MVC는 컨트롤러 QueryString을에게 작업

public ActionResult News(DateTime? FromDate, DateTime? ToDate) 
{ 
    IList<Model.MonthGroupNewsEntry> monthGroupNewsEntries = new services.NewsEntryService(new Data.SqlNewsEntryRepository()).GetMonthGroupNewsEntries(); 
    IList<Model.NewsEntry> newsEntries = new Services.NewsEntryService(new Data.SqlNewsEntryRepository()).GetNewsEntriesWithinDateRange(FromDate, 
    return View(new Models.NewsViewModel(monthGroupNewsEntries, newsEntries)); 
} 

을 올린 사람 :

<%= Html.ActionLink(b.MonthName + " " + b.Year.ToString() + " (" + b.EntryCount.ToString() + ")", "News", new { FromDate = b.FromDate, ToDate = b.ToDate}) %> 

그러나 때 아래에서 URL을 사용하여 컨트롤러를 제거하려고합니다 :

routes.MapRoute(
"Default", 
"{action}/{id}", 
new { controller = "Home", action = "Index", id = UrlParameter.Optional }); 

404 리소스를 찾을 수 없습니다. 오류가 발생합니다.

참고 : 클래스의 다른 메서드는 제대로 작동하지만 매개 변수 또는 "id"가 없으며 두 DateTime에서 호출되는 메서드 일뿐입니다. URL에서 컨트롤러를 제거 할 때 실패하는 매개 변수

업데이트 된 답변을 주셔서 감사합니다. 그러나 제가 만든 유일한 변화는 위의 "routes.MapRoute"에서 "{controller} /"텍스트를 제거하는 것입니다. 맞춤법 오류 등은 없습니다. 이것은 또한 MVC 3를 사용

또한 : Charx의 제안을 사용하여 :

routes.MapRoute(
"SpecificAction", 
"{action}/{FromDate}/{ToDate}", 
new { controller = "ControllerName", id = UrlParameter.Optional }); 

나는 더 이상 404 오류가 없지만,이 준 -로 인해 "400 잘못된 요청을"는 '/' s이므로 dd-MM-YYYY로 날짜를 다시 형식화했습니다.

<%= Html.ActionLink(b.MonthName + " " + b.Year.ToString() + " (" + b.EntryCount.ToString() + ")", "News", new { FromDate = b.FromDate.ToString("dd-MM-yyyy"), ToDate = b.ToDate.ToString("dd-MM-yyyy")}) %> 

더 이상 404가 아니기 때문에 FromDate는 잘 인식되지만 ToDate는 null로 처리됩니다.

최종 : 두 날짜의 유형을 문자열로 변경하고 메서드에서 datetime으로 캐스팅했습니다. 이제 두 매개 변수가 모두 정상적으로 처리됩니다. 아마도 첫 번째 매개 변수의 time 요소를 찾고 있었을 것입니다. 두 번째는 무시했다.

"id"매개 변수를 필요로하는 메소드는 이제 누구나 감사 할 수 있다면 "NewsEntry/5"보다는 querystring (NewsEnrty? ID = 5)으로 사용하는 것 같습니다. 그렇지 않으면 질문 대답했다 - 다시 Chanx에게 감사한다.

+1

을 컨트롤러}'를 사용하고 있습니까? 방금 두 수준의 깊은 URL을 만들려고합니까? – Charx

+0

사이트는 매우 간단합니다. URL에있는 컨트롤러가 과도한 것처럼 보이기 때문에 하나의 컨트롤러 만있을 수 있습니다. URL에서 제거 할 수는 없지만 필요한 클래스를 확인하기 위해 라우팅에 여전히 사용할 수 있습니까? – user1907097

+0

내 답변을보고 그게 효과가 있는지 알려주세요. – Charx

답변

0

편집 됨. 당신은 여전히 ​​당신의 URL에 호출 할 조치를 식별 할 수 있도록하려면, 당신은 당신의 특정 작업 경로를 지정하고 행동에있는 올바른 컨트롤러를 식별해야합니다 : 당신은 왜 {`제거

routes.MapRoute(
"SpecificAction", 
"{action}/{FromDate}/{ToDate}", 
new { controller = "ControllerName", id = UrlParameter.Optional }); 

routes.MapRoute(
"Default", // 
"{controller}/{action}/{id}", 
new { controller = "Home", action = "Index", id = UrlParameter.Optional }); 
+0

고맙지 만 WhatIWantURLDirToBe는 "nothing"이고, URL 디렉토리를 원하지 않습니다. 그러나 위와 같이 보이지 않는 액션을 원합니다. 귀하의 솔루션을 시도 할 때 색인 페이지에서 즉시 404가 표시됩니다. – user1907097

+0

아마도 {body}/{id} 경로가 "id"매개 변수를 사용하여 색인 및 모든 메소드에 완벽하게 작동하는 경로를 잘 설명하지는 못합니다. 메소드에 두 개의 DateTime이있는 경우 결과가 404가됩니까? 매개 변수 - 메서드간에 유일한 차이점은 DateTime? 매개 변수 메서드를 사용하면 표준 "/ xxxxx"유형 mvc url 대신 쿼리 문자열 유형 "? from = xxxxx & to = xxxxx"가됩니다. "{controller} /"DateTime 메서드 만 제거하면 모든 메서드가 "{controller}/{action}/{id}"와 완벽하게 작동합니까? 매개 변수가 실패합니다. – user1907097

+0

오른쪽. 설명 부분이 누락되었습니다. 수정 된 답변, 필요한 정보에 가까워지기를 바랍니다. – Charx

0

질문을 편집 할 때 얻으려는 초기 답을 얻을 수 있습니다. 또한 문제를 테스트 할 수있는 간단한 솔루션을 만들고 뉴스 컨트롤러 작업에서도 잘 작동합니다. 날짜가 라우팅에 영향을 줄 수있는 방법은 없습니다. 그러나 먼저 확인해야합니다. 실수로 실수를했을 수도 있습니다. 라우팅을 다시 한 번 확인하고 컨트롤러 이름을 chech하고 다시 입력하고 적절한 작업을 n prpper 컨트롤러에 넣습니다. 문제가 계속 발생하면 문제의 작은 프로젝트를 만들고 dropbox 또는 다른 곳에서 테스트하고 얻을 수있는 곳으로 putit을 작성하십시오. 지금은 문제를 재현 할 수 없기 때문입니다. 또한, 나는 MVC 3와 함께 일하고있다.

+0

이것이 MapRoute의 마지막 매개 변수에 지정된 컨트롤러, 즉 HomeController를 사용하지 않는 이유는 무엇입니까? – BlackICE

+0

사이트가 매우 간단합니다 - 컨트롤러가 하나의 컨트롤러가 될 것만 큼 과도한 것처럼 보입니다 - URL에서 제거 할 수 없지만 필요한 클래스를 확인하기 위해 라우팅에 여전히 사용할 수 있습니까? – user1907097

+0

답변을 업데이트합니다. – Ph0en1x