2008-09-08 2 views
5

이 같은 작업이를 사용하여 나는 오전한다는 것은 :ASP.NET MVC 미리보기 4 등 정지 Url.RouteUrl()는 기존의 매개 변수

:

News.mvc/Archive/2008 

이 같은이 페이지에 양식을 가지고

<form> 
    <select name="year"> 
     <option value="2007">2007</option> 
    </select> 
</form> 

'2007'이 양식에서 선택되면 양식을 News.mvc/Archive/2007로 보내야합니다.

양식 'action'속성은 "News.mvc/Archive"이어야합니다. 나는이 같은 양식을 선언하는 경우

그러나 :

<form method="get" action="/News.mvc/Archive/2008"> 

누군가가 나에게 내가 부족 무엇인지 알려 주시기 바랍니다 수 :

<form method="get" action="<%=Url.RouteUrl("News-Archive")%>"> 

그것으로 렌더링?

답변

2

몇 가지 문제가 있다고 생각합니다.

먼저 경로에 "year"의 기본값이 없으므로 "/News.mvc/Archive"URL은 실제로 라우팅 용도로 유효하지 않습니다.

둘째, 양식 값이 경로 매개 변수로 표시 될 것으로 예상되지만 HTML은 작동하지 않습니다. 선택 및 제출시 일반 양식을 사용하는 경우 URL의 끝에 "? year = 2007"이 표시됩니다. 이것은 GET 메소드 양식이 HTML에서 작동하도록 설계된 방법입니다.

중요한 점에 대해 결론을 내릴 필요가 있습니다.

  • 당신은 사용자가 드롭 다운에서 무언가를 선택할 수 있도록하려면 그 다음 양식 제출 차단하고 올바른 수립하여 (이를 달성하기 위해 자바 스크립트를 사용해야 할거야, 제출 URL을 변경하는 경우 URL).
  • /News.mvc/Archive?year=2007을 URL로 사용해도 괜찮 으면 경로에서 {year} 지정자를 완전히 삭제해야합니다. 양식 값이 조치 메소드 매개 변수를 채울 것이기 때문에 "int year"매개 변수를 조치에 그대로 둘 수 있습니다.
+0

: 즉

public ActionResult Archive(int year) { if (!String.IsNullOrEmpty(Request["year"])) { return RedirectToAction("Archive", new { year = Request["year"] }); } if (year == 0) { /* ... */ } /* ... */ } 

3) 명시 적으로 Url.RouteUrl() 호출 해에 대한 기본 값을 지정합니다. 자세한 내용은 해당 댓글 편집을 참조하십시오. –

0

은 내가 밖으로 일했다 생각하는 이유 - 경로가 {년}을 포함하므로 생성 된 경로는 항상 너무 ..

사람이 확인할 수 경우?

0

솔루션 여기

좋아이 (가 저를 선도하기위한 브래드 덕분에) 솔루션입니다.

1) 경로에 기본값을 필요 :

routes.MapRoute(
     "News-Archive",            
     "News.mvc/Archive/{year}",       
     new { controller = "News", action = "Archive", year = 0 } 
    ); 

2)가 URL 세그먼트있는 것처럼 매개 변수를 GET 구문 분석 리디렉션을 추가합니다.

public ActionResult Archive(int year) 
{ 
    if (!String.IsNullOrEmpty(Request["year"])) 
    { 
     return RedirectToAction("Archive", new { year = Request["year"] }); 
    } 
} 

3) 확인이 요청에 대한 리디렉션 코드가 "기본"올해의 항목을 리디렉션에 대한 전에 코드를 PARAMS 있습니다. 올바른 궤도에

Url.RouteUrl("News-Archive", new { year = 0 })