2014-10-08 3 views
6

MVC 5 웹 응용 프로그램에서 대체 라우팅을 구현하려고합니다. http://example.com/account/testparam : URL을 타격 할 때 위대한 작품을MVC 대체 매개 변수로 대체 라우팅이 실패 함

namespace MyMvcProject.Web.Controllers 
{ 
    [RoutePrefix("account")] 
    public class AccountController : Controller { 


     [Route("{param}")] 
     [Authorize] 
     public ActionResult Index(string param = null) { 

... 

:

나는 컨트롤러 코드가 있습니다. 그러나 선택 매개 변수로 param 값을 가질 수 있기를 바랍니다.

[Route("{param}")][Route("{param}*")]으로 변경하려고했지만 Index() 방법을 입력하지 않았습니다. 나는 또한 [Route("{param:string=Test}")]로 변경하려고했지만 string이라는 용어로 라우팅 런타임 오류가 발생합니다.

RoutConfig.cs에는 다음이 포함

public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
      routes.MapMvcAttributeRoutes(); 

      routes.MapRoute(
       name: "Default", 
       url: "{controller}/{action}/{param}", 
       defaults: new { controller = "Home", action = "Index", param = UrlParameter.Optional } 
      ); 
     } 

사람이 내가이 대체 라우팅 구문을 사용하여 선택적 매개 변수를 가지고 Index() 강제 수있는 방법 어떤 생각을 가지고 있습니까? 그것은 내 애플 리케이션의 다른 부분에서 매우 유용하므로, RoutePrefixRoute 데코레이터를 유지하고 싶습니다.

UPDATE는

난 아직도이 알아 내려고 노력하고있어 그래서 public ActionResult Index(int id)[Route("{param:int=0}")] 내 경로 장식 내 생성자를 변경 예상대로 작동 (즉, http://example.com/account 동작합니다는 http://example.com/account/0 것처럼 입력되었습니다. . 내가로 장식 변경할 때이 난 단지 string 데이터 유형을 사용하여, 원하는 것을 정확히

입니다 : [Route("{id:string=\"\"}")]public ActionResult Index(string id)에 생성자를 내가 런타임 오류 참조 :

The inline constraint resolver of type 'DefaultInlineConstraintResolver' was unable to resolve the following inline constraint: 'string'.

답변

6

대답은 here입니다. 나는 ?을 사용하여 param을 null로 만들 수있게해야합니다.

[Route("{param?}")] 
[Authorize] 
public ActionResult Index(string param = null) { 
    ... 
} 

앞으로 도움이되기를 바랍니다. 해당 주제에서 찾을 수있는 참조가 많지 않습니다.

6

@ Brett의 대답은 입니다. Route 속성의 매개 변수에 ?을 추가 한 다음 동작 서명에 기본값을 제공하면 해당 매개 변수를 선택적으로 사용할 수 있습니다.

다음은 Mike Wasson의 우수 논문 인 Attribute Routing in Web API 2입니다. 여기에는 선택적 매개 변수가 포함되어 있습니다.

마이크 여러 제약 조건을 적용하는 방법에 대한 이야기, 다음과 같이 말한다 : 여러 제약 선택적 매개 변수를 할 때까지도 ... 좋은 작품

You can apply multiple constraints to a parameter, separated by a colon.

[Route("users/{id:int:min(1)}")] 
    public User GetUserById(int id) { ... } 

.

우리가 알고 있듯이 ?을 적용하면 매개 변수를 선택적으로 사용할 수 있습니다.따라서 위의 예를 복용 한

[Route("users/{id:int?:min(1)}")] 
public User GetUserById(int id = 1) { ... } 

정수가 0보다 크거나 비어하기 위해 id 매개 변수를 제약한다고 가정 수 (이 경우 1의 기본값이 사용됩니다). 실제로, 우리는 오류 메시지가 :

The inline constraint resolver of type 'DefaultInlineConstraintResolver' was unable to resolve the following inline constraint: 'int?'.

그것은 제약의 순서가 문제를 밝혀! 간단하게 다른 모든 제약 조건은 의도 된 행동을 후

[Route("users/{id:min(1):int?}")] 
public User GetUserById(int id = 1) { ... } 
이뿐만 아니라 2 개 이상의 제약 작동

, 예를 옵션으로 제약 ?을 제공 퍼팅

[Route("users/{id:min(1):max(10):int?}")] 
public User GetUserById(int id = 1) { ... } 
+1

주문에 대한 유용한 정보. – Nicholi