【问题标题】:Creating a URL in the controller .NET MVC在控制器 .NET MVC 中创建 URL
【发布时间】:2009-03-31 02:17:51
【问题描述】:

我需要能够在控制器上的 Action 中构造一个链接以发送电子邮件。这样做的最佳做法是什么?我不想自己构建它,以防我的路线发生变化。

我是否应该查看每封电子邮件并呈现并发送它?这可能是一个很好的方法。

【问题讨论】:

    标签: asp.net asp.net-mvc


    【解决方案1】:

    如果你只是想获取某个动作的路径,使用UrlHelper:

    UrlHelper u = new UrlHelper(this.ControllerContext.RequestContext);
    string url = u.Action("About", "Home", null);
    

    如果要创建超链接:

    string link = HtmlHelper.GenerateLink(this.ControllerContext.RequestContext, System.Web.Routing.RouteTable.Routes, "My link", "Root", "About", "Home", null, null);
    

    Intellisense 将为您提供每个参数的含义。


    来自 cmets 的更新:控制器已经有一个 UrlHelper

    string url = this.Url.Action("About", "Home", null); 
    

    【讨论】:

    • 后续:对于倒数第二个参数(RouteValueDictionary)这里是一个例子:new System.Web.Routing.RouteValueDictionary(new { id = 1 })
    • 你不需要构造一个新的UrlHelper;控制器上有一个 .Url 属性,它将为您提供正确的 RequestContext。
    • “根”从何而来?如果我必须硬编码我要匹配的路线的名称,为什么不直接硬编码 url?
    • @xr280xr:我相信在这个例子中,“Root”是在 RegisterRoutes 方法中定义的路由名称(通常在 RouteConfig 中)。对我来说,它是“默认”(就像我创建项目时一样)。
    • 你不需要新建一个 UrlHelper,只需访问 Controller 类中的 Url 属性。
    【解决方案2】:

    如果您需要完整的网址(例如通过电子邮件发送),请考虑使用以下内置方法之一:

    这样您就可以创建用于构建 url 的路由:

    Url.RouteUrl("OpinionByCompany", new RouteValueDictionary(new{cid=newop.CompanyID,oid=newop.ID}), HttpContext.Request.Url.Scheme, HttpContext.Request.Url.Authority)
    

    这里的url是路由引擎判断正确后构建的:

    Url.Action("Detail","Opinion",new RouteValueDictionary(new{cid=newop.CompanyID,oid=newop.ID}),HttpContext.Request.Url.Scheme, HttpContext.Request.Url.Authority)
    

    在这两种方法中,最后两个参数指定协议和主机名。

    问候。

    【讨论】:

    • 仅供参考,使用Url.Action(action, controller, routevalue, protocol) 也会生成完整的 URL,因此如果不需要,您不必指定主机名。
    • 我收到以下 URL,端口号加倍,请问我该如何解决? h t t p://localhost:54383:54383/MyArea/MyController/Details/1
    【解决方案3】:

    我遇到了同样的问题,Gidon 的回答似乎有一个小缺陷:它会生成一个相对 URL,不能通过邮件发送。

    我的解决方案如下所示:

    string link = HttpContext.Request.Url.Scheme + "://" + HttpContext.Request.Url.Authority + Url.Action("ResetPassword", "Account", new { key = randomString });
    

    这样会生成一个完整的 URL,即使应用程序在托管服务器上的深度有好几级,并且使用 80 以外的端口,它也能正常工作。

    编辑:我发现this 也很有用。

    【讨论】:

    • 请注意,这有一个重大的安全漏洞。只需有人修改请求标头以包含作为主机的恶意 URL,您的应用程序就会发送一封官方电子邮件,其中包含指向危险网站的链接。
    【解决方案4】:

    另一种为动作创建绝对 URL 的方法:

    var relativeUrl = Url.Action("MyAction");  //..or one of the other .Action() overloads
    var currentUrl = Request.Url;
    
    var absoluteUrl = new System.Uri(currentUrl, relativeUrl);
    

    【讨论】:

      【解决方案5】:

      我知道这是一个老问题,但如果您尝试在 ASP.NET Core 中做同样的事情,以下是如何在操作中创建 UrlHelper:

      var urlHelper = new UrlHelper(this.ControllerContext);
      

      或者,如果您从 Controller 继承,则可以只使用 Controller.Url 属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多