2009-02-08 31 views
19

Vì tôi đã quyết định để RC đi trong khi ở lại với Beta cho bây giờ, tôi không có cách nào để biết liệu một mạnh mẽ gõ RedirectToAction đã được thêm vào. Có ai đã thử nó và có một gõ mạnh mẽ RedirectToAction (và có lẽ ActionLink) trong RC?.NET MVC có một RedirectToAction được đánh máy mạnh không?

+2

Bạn nên thay đổi câu trả lời được chấp nhận cho câu trả lời của @Darrell Mozingo; vì RedirectToAction thực sự là trong hội đồng Futures. –

Trả lời

17

Không, không.

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); 
} 

Điều đó sẽ hiệu quả.

+1

Điều này có tồn tại trong dĩa Futures không? tôi không thể tìm thấy nó, nếu nó không? Tôi cũng tự hỏi tại sao nó đã bị mất? –

+0

Chad .. làm thế nào điều này có thể trở thành một phương pháp mở rộng cho lớp điều khiển? –

+0

Tôi khuyên bạn nên đặt nó trên một lớp điều khiển cơ bản và làm cho bộ điều khiển của bạn kế thừa từ đó. –

24

Điều này cũng được bao gồm trong MVC Contrib làm phương pháp tiện ích mở rộng trên bộ điều khiển của bạn, cùng với nhiều tính năng mạnh mẽ khác để xử lý ModelState, kiểm tra, v.v.

+1

Đây là câu trả lời đúng. –

0

Nếu bạn không muốn có thư viện MvcContrib đầy đủ, bạn có thể chỉ nhận được tính năng này bằng cách sử dụng gói 01GNuGet.

1

Bạn có thể sử dụng return RedirectToAction(nameof(Index));

Các vấn đề liên quan