2009-02-08 4 views
19

베타 버전으로 머무르는 동안 RC를 사용하기로 결정했기 때문에 강력한 형식의 RedirectToAction이 추가되었는지 알 길이 없습니다. 아무도 시도해 본 결과 RC에 강하게 입력 된 RedirectToAction (어쩌면 ActionLink)이 있습니까?.NET MVC에는 강력한 형식의 RedirectToAction이 있습니까?

+2

허용되는 대답을 @Darrell Mozingo의 대답으로 변경해야합니다. 왜냐하면 RedirectToAction 이 실제로 Futures 어셈블리에 있기 때문입니다. –

답변

17

아니요.

protected RedirectToRouteResult RedirectToAction<T>(Expression<Action<T>> action, RouteValueDictionary values) where T : Controller 
{ 
    var body = action.Body as MethodCallExpression; 

    if (body == null) 
    { 
     throw new ArgumentException("Expression must be a method call."); 
    } 

    if (body.Object != action.Parameters[0]) 
    { 
     throw new ArgumentException("Method call must target lambda argument."); 
    } 

    string actionName = body.Method.Name; 

    var attributes = body.Method.GetCustomAttributes(typeof(ActionNameAttribute), false); 
    if (attributes.Length > 0) 
    { 
     var actionNameAttr = (ActionNameAttribute)attributes[0]; 
     actionName = actionNameAttr.Name; 
    } 

    string controllerName = typeof(T).Name; 

    if (controllerName.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)) 
    { 
     controllerName = controllerName.Remove(controllerName.Length - 10, 10); 
    } 

    RouteValueDictionary defaults = LinkBuilder.BuildParameterValuesFromExpression(body) ?? new RouteValueDictionary(); 

    values = values ?? new RouteValueDictionary(); 
    values.Add("controller", controllerName); 
    values.Add("action", actionName); 

    if (defaults != null) 
    { 
     foreach (var pair in defaults.Where(p => p.Value != null)) 
     { 
      values.Add(pair.Key, pair.Value); 
     } 
    } 

    return new RedirectToRouteResult(values); 
} 

그래야합니다.

+1

선물 dll에 존재합니까? 나는 그것을 발견 할 수 없다. 나는 또한 그것이 왜 그리워했는지 궁금하다?? –

+0

차드 .. 어떻게 컨트롤러 클래스의 확장 메서드가 될 수 있습니까? –

+0

기본 Controller 클래스에 넣고 컨트롤러가 상속되도록하는 것이 좋습니다. –

24

이것은 Controller의 확장 메소드로서 ModelState 핸들링, 테스트 등을 위해 강하게 타자를 치는 많은 것들과 함께 MVC Contrib에 포함되어 있습니다. 이것은 제공하는 것에 대한 추가 종속성을 가질 가치가 있습니다.

+1

정답입니다. –

0

전체 MvcContrib 라이브러리가 필요없는 경우 MvcNavigationHelpers NuGet 패키지를 사용하면이 기능 만 사용할 수 있습니다.

1

사용할 수 있습니다 return RedirectToAction(nameof(Index));