2010-05-24 3 views
7

Tôi đang sử dụng Url.Action để tạo URL có hai tham số truy vấn trên trang web có định dạng XHTML nghiêm ngặt.Phương pháp được tích hợp để mã hóa ký hiệu và các url trong url được trả về từ Url.Action?

Url.Action("ActionName", "ControllerName", new { paramA="1" paramB="2" }) 

tạo:

/ControllerName/ActionName/?paramA=1&paramB=2 

nhưng tôi cần nó để tạo ra các url bằng ký hiệu và thoát:

/ControllerName/ActionName/?paramA=1&paramB=2 

Thực tế là Url.Action đang trở lại URL bằng ký hiệu và không thoát đã phá vỡ xác thực HTML của tôi. Giải pháp hiện tại của tôi là chỉ thay thế dấu và ký tự trong URL được trả lại từ Url.Action với ký hiệu thoát. Có giải pháp tích hợp hay tốt hơn cho vấn đề này không?

Trả lời

0

tôi đã kết thúc chỉ tạo ra phần mở rộng cho Url.Action gọi Url.ActionEncoded. Mã này như sau:

namespace System.Web.Mvc { 
    public static class UrlHelperExtension { 
     public static string ActionEncoded(this UrlHelper helper, StpLibrary.RouteObject customLinkObject) { 
      return HttpUtility.HtmlEncode(helper.Action(customLinkObject.Action, customLinkObject.Controller, customLinkObject.Routes)); 
     } 
     public static string ActionEncoded(this UrlHelper helper, string action) { 
      return HttpUtility.HtmlEncode(helper.Action(action)); 
     } 
     public static string ActionEncoded(this UrlHelper helper, string action, object routeValues) { 
      return HttpUtility.HtmlEncode(helper.Action(action, routeValues)); 
     } 
     public static string ActionEncoded(this UrlHelper helper, string action, string controller, object routeValues) { 
      return HttpUtility.HtmlEncode(helper.Action(action, controller, routeValues)); 
     } 
    } 
} 
1

Bất kỳ lý do bạn không thể sử dụng Server.HtmlEncode()

string EncodedUrl = Server.HtmlEncode(Url.Action("Action", "Controller", new {paramA = "1", paramB = "2"})); 

http://msdn.microsoft.com/en-us/library/w3te6wfz.aspx

+0

tôi đã hy vọng cho một số thiết lập cấu hình mà sẽ cho phép Url.Action để tự động thực hiện việc này cho tôi, nhưng điều này chắc chắn tốt hơn là chỉ thay thế dấu và ký tự theo cách thủ công. – Blegger

0

Dường như bạn gặp sự cố với việc tạo URL, chứ không phải tạo URL. URL có thể có ký tự không được mã hóa trong đó và có những nơi có thể chính xác những gì bạn cần. HTML mà bạn đang nhúng vào trong trường hợp này, mặc dù, muốn ký hiệu và các ký tự khác được mã hóa.

Trong khi một phương pháp trợ giúp có thể lưu một số lượt xem, tôi luôn thấy nó giúp giảm đau đầu để có bất kỳ mã hóa hiển thị nào được thực hiện tại thời điểm có thể cuối cùng để tôi luôn làm việc với chuỗi/URL chính hãng cho đến thời điểm tôi cần nó thao tác để sử dụng trong một định dạng đầu ra cụ thể. Nếu bạn đặt phần mở rộng của trình trợ giúp từ your answer trong HtmlHelper, bạn sẽ ít bị cám dỗ để mã hóa URL trước khi thực sự cần thiết.

Nói một cách thô trong HTML:

// with MVC3 auto-encoding goodness 
<%:Url.Action(...)%> 
// old-school MVC 
<%=Html.Encode(Url.Action(...))%> 

Để đặt nó trong một neo/src thuộc tính trực tiếp trong một cái nhìn, bạn có thể có thể nhận được ngay với Html.Encode hoặc tùy chọn ít nghiêm ngặt:

<%=Html.AttributeEncode(Url.Action(...))%> 
7

này đã làm việc cho tôi:

Html.Raw(Url.Action("ActionName", "ControllerName", new { paramA="1" paramB="2" })) 
+0

Html.Raw thực sự là để loại bỏ mã hóa bắt buộc của @Razor. –