2009-11-25 20 views

Trả lời

12

Bạn nên xây dựng đúng tuyến đường của bạn trong bảng định tuyến. Eg .:

routes.MapRoute("MyRoute" ,"{controler}/{id}#{detail}" ,new { controller = "users", action = "index", id = (string)null, detail = "Summary" }); 
0

Tôi làm điều tương tự trên trang web của tôi here. Nhưng nó không phải với RedirectToRouteResult. RedirectToRouteResult không hỗ trợ bao gồm phần neo vào url.

Bạn cần tự xây dựng liên kết và thậm chí cả logic để xử lý việc xử lý phần neo - như tôi đã làm. Ứng dụng của tôi cố gắng sao chép chức năng tương tự như chức năng của chế độ xem thư viện ảnh Facebook. Mỗi liên kết đến một trang khác nhau phải có một url duy nhất, vì vậy tôi sử dụng phần neo này. Nhưng coz nó không dịch trực tiếp đến một lộ trình tôi phải phân tích cú pháp phần neo của url theo cách thủ công trên trang và sử dụng ajax để tải nội dung thích hợp. Đây là những gì tôi muốn vì vậy nó hoạt động cho tôi.

+1

Chỉ vậy thôi; Tôi biết tôi có thể tự xây dựng một URL, nhưng tôi muốn hưởng lợi từ các kiểm tra mạnh mẽ trong các bài kiểm tra đơn vị của tôi khi khẳng định, ví dụ. –

+1

tôi hiểu. tôi nghĩ rằng bạn đang ra khỏi may mắn sau đó –

0

Tải source code of MVC và kiểm tra như thế nào RedirectToRouteResult làm việc

Có thể có những cách tốt hơn nhưng một thừa kế đơn giản của RedirectToRouteResult và ghi đè của ExecuteResult để cho phép một bộ phận neo buộc phải sửa chữa vấn đề

5

UrlHelper.GenerateUrl bao gồm thông số phân đoạn. Tôi tạo ra một phương pháp khuyến nông

 public static string Action(this UrlHelper url, string actionName, string controllerName, string fragment, object routeValues) 
     { 
      return UrlHelper.GenerateUrl(
       routeName: null, 
       actionName: actionName, 
       controllerName: controllerName, 
       routeValues: new System.Web.Routing.RouteValueDictionary(routeValues), 
       fragment: fragment, 
       protocol: null, 
       hostName: null, 
       routeCollection: url.RouteCollection, 
       requestContext: url.RequestContext, 
       includeImplicitMvcValues: true /*helps fill in the nulls above*/ 
      ); 
     } 

Sau đó, tôi tạo ra một lớp RedirectToFragmentResult

public class RedirectToFragmentResult: RedirectResult 
{ 
    public UrlHelper Url {get;set;} 
    public string Action { get; set; } 
    public string Controller { get; set; } 
    public string Fragment { get; set; } 
    public object RouteValues { get; set; } 
    public RedirectToFragmentResult(UrlHelper url, string action, string controller, string fragment, object routeValues) 
     :base(url.Action(action, controller, fragment, routeValues)) 
    { 
     Url = url; 
     Action = action; 
     Controller = controller; 
     Fragment = fragment; 
     RouteValues = routeValues; 
    } 
} 

Sau đó, bạn chỉ có thể tạo ra một RouteValueDictionary mới (result.RouteValues) trong thử nghiệm đơn vị của bạn để kiểm tra nó theo cách bạn làm với một RedirectToRouteResult.

+0

Cảm ơn @ Joel Điều này dường như làm việc rất tốt. Không cần thiết cho thuộc tính URL cục bộ (điều này sẽ tạo ra một cảnh báo 'ẩn'). Tôi đã thử nghiệm với các dòng được gỡ bỏ: 'public UrlHelper Url {get; thiết lập;} 'và' Url = url; '- bất kỳ lý do nào tại sao điều này là có? – Chris

+1

Tôi đã sử dụng tính năng này để gỡ lỗi tiện lợi, vì vậy tôi có thể truy cập urlhelper từ cửa sổ xem, nhưng bạn chính xác cơ sở đó (url.Có nghĩa là thời gian thực cuối cùng được sử dụng và không cần thiết để thử nghiệm) –

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