Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在asp.net-mvc站点中,是否有更好的方法获取完整的基本URL?_Asp.net Mvc_Url - Fatal编程技术网

在asp.net-mvc站点中,是否有更好的方法获取完整的基本URL?

在asp.net-mvc站点中,是否有更好的方法获取完整的基本URL?,asp.net-mvc,url,Asp.net Mvc,Url,我有一个asp.net-mvc网站,我从我的网站发送了很多电子邮件。以前,我使用控制器发送电子邮件,并使用以下代码获取基本url: protected string GetBaseUrl() { return string.Format("{0}://{1}{2}", Request.Url.Scheme, Request.Url.Authority, Url.Content("~")); } 这是因为我显然需要完全格式的URL。因此,在我的href=“

我有一个asp.net-mvc网站,我从我的网站发送了很多电子邮件。以前,我使用控制器发送电子邮件,并使用以下代码获取基本url:

    protected string GetBaseUrl()
    {
        return string.Format("{0}://{1}{2}", Request.Url.Scheme, Request.Url.Authority, Url.Content("~"));
    }
这是因为我显然需要完全格式的URL。因此,在我的href=“/GoHere”页面上的普通链接中,我希望将其转换为:

  "http://www.mysite.com/GoHere"
不仅仅是相对URL,因为它们会出现在类似

  "/GoHere"
我现在正在重构我的控制器,以便将所有这些代码移到它之外,但我发现自己正在传递这个baseURL字符串(因为上面的函数依赖于命名空间中的请求:

  System.Web 
而且我似乎无法访问控制器类之外的这个请求对象。现在我正在到处传递一个字符串BaseURL,因此当我需要生成电子邮件时,我可以在基本URL之后附加相对URL,但这感觉非常粗糙


在asp.net-mvc网站中,是否有更好的方法(通过请求对象或不通过请求对象)在控制器类之外获取baseURL?

问题在于以编程方式确定
baseURL,因为它是高度相关的,并且可以在许多URL上访问网站。例如:

* http://localhost/GoHere             locally
* http://localhost:8080/GoHere        locally on another port
* http://127.0.0.1/GoHere             locally by the loop back address
* http://10.0.10.5/GoHere             the internal IP of the machine
* http://72.34.56.78/GoHere           the public IP of the machine
* http://www.mysite.com/GoHere        preferred public URL
* http://www.bestsiteever.com/GoHere  SEO URL

在配置文件、客户数据库或任何需要将
baseURL
与电子邮件关联的方式中设置
baseURL
会更容易。

UrlHelper.Action
具有接受“协议”的重载。使用此选项可生成符合路由表的完整URL

var baseUrl = Url.Action("Index", "Home", null, Request.Url.Scheme);

在具有默认路由的默认项目MVC中,这将返回如下内容:

http://mydomain.com

注意,如果您不能使用/访问<代码> HttpRequest <代码>对象,请考虑传递该方案,或者如果您知道它始终是“HTTPS”(例如),那么您可以使用魔术(硬编码)字符串或从设置/配置文件中读取它。 您可以通过以下方式访问控制器外部的HttpRequest对象:

var request = System.Web.HttpContext.Current.Request;
同样,访问控制器的UrlHelper实例时也会遇到同样的问题。您可以创建如下实例:

var url = new UrlHelper(System.Web.HttpContext.Current.Request.RequestContext);

HttpRequest.RequestContext
是.NET 4.0的新版本。我想我不会认为您还没有指定一个工作版本。

我只是在尝试复制GetBaseUr()中的代码doesbut您如何访问控制器外部的请求对象?谢谢..因此我可以使用Current.Request获取请求对象,但我现在需要弄清楚如何复制最后一个参数(Url.Content(“~”)…您知道Url.Content(“~”)提供了什么吗?Url.Content(“~”)是根路径。如果要使用的url后面有有效的操作,则不需要使用该路径。只需使用url.action的“action”和“controller”参数,并让路由处理其余部分。