2008-08-08 24 views
19

Tôi muốn một số liên kết bao gồm số nhận dạng phân đoạn. Giống như một số URL trên trang web này:Có cách nào để bao gồm một định danh mảnh khi sử dụng Asp.Net MVC ActionLink, RedirectToAction, vv?

Debugging: IE6 + SSL + AJAX + post form = 404 error# 5626

Có cách nào để làm điều này với bất kỳ phương pháp tích hợp sẵn trong MVC? Hoặc tôi có phải cuộn người trợ giúp HTML của riêng mình không?

Trả lời

5

Chúng tôi đang xem xét việc hỗ trợ cho điều này trong bản phát hành tiếp theo của chúng tôi.

+0

là điều này sẽ được nhắm mục tiêu để được phát hành trong dev10? – ajma

1

Câu trả lời ngắn gọn là: Không. Trong ASP.NET MVC Preview 3 không có cách thứ nhất để bao gồm một liên kết trong một liên kết hành động. Không giống như url_for của Rails: anchor, UrlHelper.GenerateUrl (và ActionLink, RedirectToAction và những thứ khác sử dụng nó) không có tên thuộc tính ma thuật cho phép bạn mã hóa một anchor.

Khi bạn chỉ ra, bạn có thể tự cuộn của riêng mình. Đây có lẽ là giải pháp sạch nhất.

Hackily, bạn chỉ có thể bao gồm một neo trong một lộ trình và xác định các giá trị trong thông số hash của bạn:

routes.MapRoute("WithTarget", "{controller}/{action}/{id}#{target}"); 
... 
<%= Html.ActionLink("Home", "Index", new { target = "foo" })%> 

Điều này sẽ tạo ra một URL như/Home/Index/# foo. Rất tiếc, điều này không phù hợp với thông số URL xuất hiện ở cuối URL. Vì vậy, hack này chỉ có thể thực hiện được trong các trường hợp thực sự đơn giản, nơi tất cả các tham số của bạn xuất hiện dưới dạng các thành phần đường dẫn URL.

+1

Không hoạt động. # Được chuyển thành% 23. – jpbochi

3

@Dominic,

Tôi gần như tích cực khi đặt tuyến đường đó sẽ gây ra sự cố định tuyến.

@Ricky,

Cho đến MVC đã hỗ trợ cho điều này, bạn có thể thêm một chút "trường cũ" về làm thế nào bạn thực hiện các tuyến đường của bạn. Ví dụ, bạn có thể chuyển đổi:

<%= Html.ActionLink("Home", "Index") %> 

thành:

<a href='<%= Url.Action("Index") %>#2345'>Home</a> 

Hoặc bạn có thể viết helper của riêng bạn mà không về cơ bản giống nhau.

+1

Tôi đã thử các mục tiêu trong các tuyến với ASP.NET MVC Preview 3 và không có vấn đề với định tuyến. Vì vậy, mặc dù bạn đang "gần như tích cực" nó sẽ hữu ích cho bạn để xây dựng trên những vấn đề sẽ có. –

18

Như Brad Wilson đã viết, bạn có thể xây dựng liên kết của riêng bạn trong quan điểm của bạn bằng cách nối chuỗi đơn giản. Tuy nhiên, để thêm một tên đoạn để chuyển hướng tạo ra thông qua RedirectToAction (hoặc tương tự), bạn sẽ cần một cái gì đó như thế này:

public class RedirectToRouteResultEx : RedirectToRouteResult { 

    public RedirectToRouteResultEx(RouteValueDictionary values) 
     : base(values) { 
    } 

    public RedirectToRouteResultEx(string routeName, RouteValueDictionary values) 
     : base(routeName, values) { 
    } 

    public override void ExecuteResult(ControllerContext context) { 
     var destination = new StringBuilder(); 

     var helper = new UrlHelper(context.RequestContext); 
     destination.Append(helper.RouteUrl(RouteName, RouteValues)); 

     //Add href fragment if set 
     if (!string.IsNullOrEmpty(Fragment)) { 
      destination.AppendFormat("#{0}", Fragment); 
     } 

     context.HttpContext.Response.Redirect(destination.ToString(), false); 
    } 

    public string Fragment { get; set; } 
} 

public static class RedirectToRouteResultExtensions { 
    public static RedirectToRouteResultEx AddFragment(this RedirectToRouteResult result, string fragment) { 
     return new RedirectToRouteResultEx(result.RouteName, result.RouteValues) { 
      Fragment = fragment 
     }; 
    } 
} 

Và sau đó, trong điều khiển của bạn, bạn muốn gọi:

return RedirectToAction("MyAction", "MyController") 
     .AddFragment("fragment-name"); 

Điều đó sẽ tạo URL chính xác.

+3

Điều này thật tuyệt. Trong MVC3 có quá tải đến 'ActionLink' cho phép bạn thực hiện một đoạn, nhưng không phải là' RedirectToAction'. – kamranicus

+0

Bạn, thưa bạn, là anh hùng của tôi. :) –

0

Đây là giải pháp phía khách hàng nhưng nếu bạn có sẵn jquery, bạn có thể làm điều gì đó như thế này.

<script language="javascript" type="text/javascript"> 
    $(function() { 
     $('div.imageHolder > a').each(function() { 
      $(this).attr('href', $(this).attr('href') + '#tab-works'); 
     }); 
    }); 
</script> 
4

Trong MVC3 (và có thể trước đó tôi chưa chọn), bạn có thể sử dụng UrlHelper.GenerateUrl truyền tham số phân đoạn.Dưới đây là một phương pháp helper tôi sử dụng để quấn functionalityL

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*/ 
    ); 
} 
+0

Hơi khó xử, nhưng đó là câu trả lời hay nhất ở đây. Có lẽ, những người khác là chỉ ra ngày. – jpbochi

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