2010-02-11 7 views
1

컨트롤러 작업의 매개 변수를 정수로 제한하기 위해 경로를 가져 오는 데 문제가 있습니다.ASP.NET MVC 경로가 제약 조건과 함께 작동하지 않습니다.

[RequiresRole(RoleToCheckFor = "Administrator"), AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Edit(int id) 
    { 
     ... 
    } 

및 Global.asax.cs에 다음과 같은 경로 : 다음과 같이

나는 AA 컨트롤러 액션이

 routes.MapRoute(
      "UserEdit",  
      "user/edit/{id}",  
      new {controller = "user", action = "edit"}, 
      new {id = @"\d+"} 
      ); 

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

     routes.MapRoute("Error", 
       "{*url}", 
       new { controller = "Error", action = "notfound" }); 

내가 때문에 기대하고있어 그 난 http://domain.com/user/edit/ABCD 내가 shouldn을 입력하면 ' 다음과 같은 일반적인 오류가 발생합니다 :

매개 변수 사전에 null이 포함되어 있습니다 매개 변수 방법이 아닌 nullable 형식 '선택 System.Int32'의 '아이디' 'System.Web.Mvc.ActionResult 편집 (INT32)'

이 (내가 생각하는)에 대한 항목도 http://www.asp.net/%28S%28pdfrohu0ajmwt445fanvj2r3%29%29/learn/mvc/tutorial-24-cs.aspx

말했다 무엇 정확하게

그러나 여전히 "... null 항목 ..."오류가 표시됩니다.

이유가 무엇입니까? 경로 설정에 문제가 있습니까?

감사

답변

3

두 번째 경로는

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

그것을 잡기 및 제약이다. 제약 조건이 일치하지 않기 때문에

사용 Phil Haacks route debugger for such issues 바울이 지적한대로

1

, 경로가 제대로 생략되고있다. 따라서 라우팅 시스템은 다음 경로로 계속 진행하고 일치시킵니다. 두 번째 경로는 제한되지 않으므로 일치하고 처리됩니다.

이 문제를 해결하는 방법에는 여러 가지가 있습니다.

가장 간단한 방법 중 하나는 경로에서 제약 조건을 제거하고 컨트롤러 동작에서 매개 변수 유효성 검사 체크 인을 수행하는 것입니다.

또 다른 방법은 오류를 표시하는 역할을 편집 경로 직후 추가 경로를 추가하는 것입니다 :이 길가에 제약이 없습니다과 EditError 조치에가는 것을

routes.MapRoute(
     "UserEditError", 
     "user/edit/{id}", 
     new {controller = "user", action = "EditError"} 
     ); 

참고. 이렇게하면 잘못된 URL을 입력하는 사람들에게 더 나은 오류를 제공 할 수 있습니다.

0

난 항상 메이크업에 관리의 실수로

controller = "HomeController" 대신 controller = "Home"

을 넣어하는 것입니다. 매회 경로가 깨질 수 있습니다. :-)

context.MapRoute(
    name: "RedirectAll", 
    url: "{*url}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
    namespaces: new[] { typeof(HomeController).Namespace }, 
        constraints: new { host = new HostConstraint("defenderrazor.com") }); 
관련 문제