Nhận URL tuyệt đối nghĩa là một Hành động ASP.NET MVC


77

Đây có lẽ là một câu hỏi giả nhưng tôi không thể tìm thấy một dấu hiệu rõ ràng. Tôi có một lớp POCO trong ứng dụng web MVC3 có mục đích duy nhất là quản lý bản sao lưu của một số tệp trong máy chủ. Thông thường, nó tạo một bản sao lưu và trả lại tên tệp cho bộ điều khiển, bộ điều khiển sẽ gửi một email với URL để tải xuống. Điều này hoạt động tốt, nhưng tôi không thể tạo URL tuyệt đối để gửi. Bất kể tôi sử dụng chức năng nào, tôi luôn nhận được một URL tương đối, như /Backup/TheFile.zip , thay vì ví dụ: http://www.somesite.com/Backup/TheFile.zip . Tôi đã thử:

VirtualPathUtility.ToAbsolute("~/Backup/SomeFile.zip");
HttpRuntime.AppDomainAppVirtualPath + "/Backup/SomeFile.zip";
Url.Content("~/Backup/SomeFile.zip");

nhưng tất cả chúng đều trả về một cái gì đó như /Backup/SomeFile.zip . Bất kỳ ý tưởng?


1
Câu trả lời ở đây đã giúp tôi trong một kịch bản tương tự. Câu trả lời này giải quyết cả http / https và portnumbers. Điều này rất hữu ích vì quá trình phát triển cục bộ của tôi trên http với số cổng nhưng giải pháp sản xuất trên https.
Sujeewa

Câu trả lời:


117

Bạn có thể làm điều đó bằng cách sau:

var urlBuilder =
    new System.UriBuilder(Request.Url.AbsoluteUri)
        {
            Path = Url.Action("Action", "Controller"),
            Query = null,
        };

Uri uri = urlBuilder.Uri;
string url = urlBuilder.ToString();
// or urlBuilder.Uri.ToString()

Thay vì Url.Action()trong mẫu này, bạn cũng có thể sử dụng Url.Content(), hoặc bất kỳ phương pháp định tuyến nào, hoặc thực sự chỉ truyền một đường dẫn.

Nhưng nếu URL chuyển đến a Controller Action, có một cách nhỏ gọn hơn:

var contactUsUriString =
    Url.Action("Contact-Us", "About",
               routeValues: null /* specify if needed */,
               protocol: Request.Url.Scheme /* This is the trick */);

Bí quyết ở đây là một khi bạn chỉ định protocollược đồ / khi gọi bất kỳ phương thức định tuyến nào, bạn sẽ nhận được một URL tuyệt đối. Tôi đề xuất cách này khi có thể , nhưng bạn cũng có cách chung chung hơn trong ví dụ đầu tiên trong trường hợp bạn cần.

Tôi đã viết blog về nó chi tiết tại đây:
http://gurustop.net/blog/2012/03/23/writing-absolute-urls-to-other-actions-in-asp-net-mvc/

Trích từ Bản tin AngularJS & Web Dev Goodies của Meligy


Đã chỉnh sửa: nếu yêu cầu của bạn Uri có phân đoạn truy vấn, Bạn cũng có thể cần ghi đè thuộc tính Truy vấn trên trình tạo Uri!
Tim Lovell-Smith

Đây là bài đăng tóm tắt nhanh với tất cả các tùy chọn: benjii.me/2015/05/…
Ben Cull

35

Từ bên trong bộ điều khiển:

var path = VirtualPathUtility.ToAbsolute(pathFromPoco);
var url = new Uri(Request.Url, path).AbsoluteUri

1
VirtualPathUtility vẫn trả về một Uri tương đối trong bộ điều khiển MVC4
Maksim Vi.

6
Và kết hợp với lớp Uri, đó là tất cả những gì bạn cần. Loại bình luận vô nghĩa.
Chris

Đầu tiên tôi sẽ chuyển đường dẫn của bạn thông qua phương thức Url.Content (). Câu trả lời này sẽ không thành công đối với các đường dẫn không phải là tuyệt đối (bắt đầu bằng '/').
Neil Monroe

19

Điều này phù hợp với tôi:

using System;
using System.Web;
using System.Web.Mvc;

public static class UrlExtensions
{
    public static string Content(this UrlHelper urlHelper, string contentPath, bool toAbsolute = false)
    {
        var path = urlHelper.Content(contentPath);
        var url = new Uri(HttpContext.Current.Request.Url, path);

        return toAbsolute ? url.AbsoluteUri : path;
    }
}

Cách sử dụng trong cshtml:

@Url.Content("~/Scripts/flot/jquery.flot.menuBar.js", true)

Điều đó thật tuyệt. Tôi thực sự đã viết gần như chính xác những gì bạn đề xuất trong câu trả lời của mình, nhưng không nghĩ đến việc thêm nó như một sự ghi đè vào phương pháp Nội dung để làm cho nó thậm chí còn gọn gàng hơn. Cảm ơn!
Neil Monroe

Cảm ơn rất nhiều cho giải pháp tuyệt vời. Tôi đang sử dụng chỉ thị ng-include và tôi đã gặp rất nhiều vấn đề do các đường dẫn tương đối. Chỉ có điều mà tôi đã thêm vào mã của bạn là '' xung quanh url.
FrenkyB

4

Trình trợ giúp tích hợp trong MVC 4 tạo URL tuyệt đối nếu hosthoặc protocoltham số không trống. Xem câu trả lời này ở đây với một phương pháp mở rộng mẫu để sử dụng trong các dạng xem.


1

Trong ASP.Net Core 2.0 (MVC), điều này hoạt động để tạo một url tuyệt đối cho một hành động.

var url = Url.Action("About", "Home", new { /*Route values here*/ }, Request.Scheme);

0

Tôi đã viết một lớp trợ giúp cho việc này, cho MVC 5 ... Nó khá linh hoạt và đặc biệt hữu ích nếu bạn cần chức năng này khi bạn không ở bên trong bộ điều khiển. Bạn sẽ có thể thả nó ngay vào một dự án và đi.

Như Meligy đã chỉ ra, điều quan trọng là phải bao gồm giao thức. Ở đây tôi đã mã hóa nó thành http, vì vậy nếu bạn muốn sử dụng SSL có thể cần phải linh hoạt hơn một chút.

public class AbsoluteUrlHelper
{
    /// <summary>
    /// Creates an absolute "fully qualified" url from an action, and assumes the current controller.
    /// </summary>
    /// <returns></returns>
    public static string GetAbsoluteUrl(string action, object routeValues = null)
    {
        var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);
        var values = urlHelper.RequestContext.RouteData.Values;
        var controller = values["controller"].ToString();

        return GetAbsoluteUrl(action, controller, urlHelper, routeValues);
    }

    /// <summary>
    /// Creates an absolute "fully qualified" url from an action and controller.
    /// </summary>
    public static string GetAbsoluteUrl(string action, string controller, object routeValues = null)
    {
        var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);

        return GetAbsoluteUrl(action, controller, urlHelper, routeValues);
    }

    /// <summary>
    /// Creates an absolute "fully qualified" url from an action and controller.
    /// </summary>
    public static string GetAbsoluteUrl(string action, string controller, UrlHelper urlHelper, object routeValues = null)
    {
        var uri = urlHelper.Action(action, controller, routeValues, "http");

        return uri;
    }
}

-5

Bạn có một vài lựa chọn:

  • Lưu giá trị của HttpContext.Request.Url trong biến tĩnh hoặc biến thành viên và sử dụng giá trị đó để chuyển đường dẫn Đủ điều kiện.
  • Lưu miền ứng dụng trong cài đặt ứng dụng trong web.config.
  • Mã cứng giá trị.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.