2010-05-06 3 views
6

이름에 하이픈이있는 쿼리 문자열 매개 변수를 만드는 타사 소프트웨어를 사용하고 있습니다. this SO question을 살펴 보았습니다. 솔루션이 내가 필요한 것에 매우 가깝지만, 기본 MVC에 너무 무지하여 필요한 것을 수행하는 방법을 알 수 없었습니다. 이상적으로는 하이픈을 밑줄로 바꾸기 만하면 충분합니다. 더 좋은 것이 있다면, 나는 그것을 듣는 데 관심이 있습니다. 이 컨트롤러와이름에 하이픈을 사용하여 MVC2 변수 처리

http://localhost/app/Person/List?First-Name=Bob&My-Age=3 

: 그래서 생성되는

public ActionResult List(string First_Name, int My_Age) 
{ 
    {...} 
} 

가 나는 쿼리 문자열을 변경할 수 없습니다, 반복 내가 그것을 지원해야

내가 처리하고자하는 URL의 예는 이것이다 내 컨트롤러와 어떻게 든. 그러나 어떻게?

참고로

은 아래 우리는 내가 원하는 것을 달성하기 위해 수정할 수 있습니다 내가 그 위에 언급 된 SO 질문에서 컨트롤러 이름과 액션 이름에 밑줄을 처리하는 데 사용되는 사용자 정의 RouteHandler입니다 :

public class HyphenatedRouteHandler : MvcRouteHandler 
{ 
    protected override IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-", "_"); 
     requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", "_"); 
     return base.GetHttpHandler(requestContext); 
    } 
} 

답변

7

[Bind(Prefix="First-name")]을 사용해 보셨습니까? 작동 할 수도 ...

한 가지 방법은 사용자 정의 모델 바인더 일 것입니다. 또 다른 방법은 액션 필터를 사용하는 것입니다. 유형 특정 작업을 수행하려면 모델 바인더를 사용하십시오. 특정 액션 또는 컨트롤러에서이 작업을 수행하려면 작업 필터를 사용하십시오. 그래서 후자의 방법으로 다음과 같이 할 수 있습니다 :

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var keys = filterContext.HttpContext.Request.QueryString.AllKeys.Where(k => k.Contains('-')); 
     foreach(var k in keys) 
     { 
      filterContext.ActionParameters.Add(
       new KeyValuePair<string, object>(
        k.Replace('-', '_'), filterContext.HttpContext.Request.QueryString[k])); 
     } 
     base.OnActionExecuting(filterContext); 
    } 
+0

실제로 요소가 이미 존재하므로 예외가 발생하는 ActionParameters를 추가하는 대신 값을 설정할 수 있습니다. 'filterContext.ActionParameters [k. ('-', '_')] = filterContext.HttpContext.Request.QueryString [k]; ' –

+0

흥미로운 아이디어, @ 다린. 나는 내가 더 좋아하는 길을 확신하지 못한다. –

+0

좋아하는 문제가 아니므로 메서드의 인수 이름에서 오는'ActionParameters' 컬렉션에 이미'First_Name' 매개 변수가 있으므로 코드가 예외를 throw합니다. –

1

나는 같은 문제가있었습니다. 오히려 너무 복잡 뭔가를하는 것보다 결국 난 그냥 매개 변수가없는 넣다 당신은 널 (null)을 확인 할 수 있습니다

string First_Name = Request["First-Name"]; 

사용하여 쿼리 문자열 매개 변수를 얻을 수 있지만, 이것은 나를 위해 그것을 정리. 테스트 목적을 위해 ActionResult에 선택적 매개 변수를 포함 할 수도 있습니다.

관련 문제