This probably is a dummy question but I cannot find a clear indication. I have a POCO class in a MVC3 web application whose only purpose is managing the backup of some files in the server. Typically it creates a backup and returns the filename to the controller, which sends an email with the URL for downloading it. This works fine, but I cannot build the absolute URL to be sent. No matter which function I use, I always get a relative URL, like /Backup/TheFile.zip, rather than e.g. http://www.somesite.com/Backup/TheFile.zip. I tried:
VirtualPathUtility.ToAbsolute("~/Backup/SomeFile.zip"); HttpRuntime.AppDomainAppVirtualPath + "/Backup/SomeFile.zip"; Url.Content("~/Backup/SomeFile.zip");
but they all return something like /Backup/SomeFile.zip. Any idea?
Yes, there is a difference. Html. ActionLink generates an <a href=".."></a> tag whereas Url. Action returns only an url.
RouteUrl(String, Object) Generates a fully qualified URL for the specified route values by using a route name. RouteUrl(String, RouteValueDictionary) Generates a fully qualified URL for the specified route values by using a route name.
You can do it by the following:
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()
Instead of Url.Action()
in this sample, you can also use Url.Content()
, or any routing method, or really just pass a path.
But if the URL does go to a Controller
Action
, there is a more compact way:
var contactUsUriString = Url.Action("Contact-Us", "About", routeValues: null /* specify if needed */, protocol: Request.Url.Scheme /* This is the trick */);
The trick here is that once you specify the protocol
/scheme when calling any routing method, you get an absolute URL. I recommend this one when possible, but you also have the more generic way in the first example in case you need it.
I have blogged about it in details here:
http://gurustop.net/blog/2012/03/23/writing-absolute-urls-to-other-actions-in-asp-net-mvc/
Extracted from Meligy’s AngularJS & Web Dev Goodies Newsletter
From within the controller:
var path = VirtualPathUtility.ToAbsolute(pathFromPoco); var url = new Uri(Request.Url, path).AbsoluteUri
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With