【问题标题】:Programatically get controller address of ASP.NET MVC application以编程方式获取 ASP.NET MVC 应用程序的控制器地址
【发布时间】:2010-09-22 11:57:54
【问题描述】:

假设我想从我的 MVC 应用程序中发送一封电子邮件,其中包含指向某个项目的链接。

所以我想在我的控制器中添加一些东西,例如:

string link = "www.mysite/mycontroller/itemdetails/23"; 

我可以通过编程方式检索它,以便它可以在我碰巧坚持的任何服务器/配置上工作吗?

例如

string link = GetCurrentActionRoute() + "23";

【问题讨论】:

  • 链接和您所引用的应用程序是否托管在同一台服务器上?

标签: asp.net-mvc asp.net-mvc-2 asp.net-mvc-routing


【解决方案1】:
public ActionResult Index()
{
    string link = Url.Action(
        (string)RouteData.Values["action"],
        (string)RouteData.Values["controller"], 
        new { id = "23" }, 
        Request.Url.Scheme
    );
    // TODO: do something with the generated link
    return View();
}

【讨论】:

    【解决方案2】:

    我使用以下来自我的 Controller 类的扩展方法来生成指向各种操作的链接。

    例子:

    string link = this.Action("Play");
    string fullLink = this.FullUrlAction("Play", new { id = 1 });
    

    方法:

    /// <summary>
    /// Helper Extensions to the Controller class.
    /// </summary>
    public static class ControllerExtensions
    {
        /// <summary>
        /// Get an action link for a controller.
        /// </summary>
        /// <param name="controller">Controller instance.</param>
        /// <param name="action">Action to provide the link for.</param>
        /// <returns>Link Url for the Action.</returns>
        public static string Action(this Controller controller, string action) 
        {
            RouteValueDictionary rvd = new RouteValueDictionary
                                           {
                                               { "controller", controller.GetType().Name }, 
                                               { "action", action }
                                           };
    
            return RouteTable.Routes.GetVirtualPath(controller.ControllerContext.RequestContext, rvd).VirtualPath;
        }
    
        /// <summary>
        /// Get an action link for a controller.
        /// </summary>
        /// <param name="controller">Controller instance.</param>
        /// <param name="action">Action Name.</param>
        /// <param name="parameters">Action Parameters.</param>
        /// <returns>Link Url for the action with parameters.</returns>
        public static string Action(this Controller controller, string action, object parameters)
        {
            string controllerName = controller.GetType().Name;
            if (controllerName.EndsWith("Controller"))
            {
                controllerName = controllerName.Substring(0, controllerName.Length - 10);
            }
    
            return controller.Action(controllerName, action, parameters);
        }
    
        /// <summary>
        /// Get an action link for a controller.
        /// </summary>
        /// <param name="controller">Controller instance.</param>
        /// <param name="targetController">Target controller for action.</param>
        /// <param name="action">Action Name.</param>
        /// <param name="parameters">Action Parameters.</param>
        /// <returns>Link Url for the action on the given controller.</returns>
        public static string Action(this Controller controller, string targetController, string action, object parameters)
        {
            RouteValueDictionary rvd = new RouteValueDictionary(parameters)
                                           {
                                               { "controller", targetController }, 
                                               { "action", action }
                                           };
    
            return RouteTable.Routes.GetVirtualPath(controller.ControllerContext.RequestContext, rvd).VirtualPath;
        }
    
        /// <summary>
        /// Get a fully qualified action link for a controller.
        /// </summary>
        /// <param name="controller">Controller instance.</param>
        /// <param name="action">Action Name.</param>
        /// <param name="parameters">Action Parameters.</param>
        /// <param name="requestUrl">Current request URI.</param>
        /// <returns>Fully qualified Link Url.</returns>
        public static string FullUrlAction(this Controller controller, string action, object parameters, Uri requestUrl)
        {
            string controllerName = controller.GetType().Name;
            if (controllerName.EndsWith("Controller"))
            {
                controllerName = controllerName.Substring(0, controllerName.Length - 10);
            }
    
            return controller.FullUrlAction(controllerName, action, parameters, requestUrl);
        }
    
        /// <summary>
        /// Get a fully qualified action link for a controller.
        /// </summary>
        /// <param name="controller">Controller instance.</param>
        /// <param name="targetController">Target controller for action.</param>
        /// <param name="action">Action Name.</param>
        /// <param name="parameters">Action Parameters.</param>
        /// <param name="requestUrl">Current request URI.</param>
        /// <returns>Fully Qualified Link Url.</returns>
        public static string FullUrlAction(this Controller controller, string targetController, string action, object parameters, Uri requestUrl)
        {
            string testUrl = VirtualPathUtility.ToAbsolute(controller.Action(targetController, action, parameters));
            return new Uri(requestUrl, testUrl).ToString();
        }
    }
    

    【讨论】:

    • 西蒙斯蒂尔,你给出了一个很好的答案。我找了好几个星期。想知道为什么这个论坛中的其他人以前不欣赏您的回答。
    【解决方案3】:

    如果链接将指向与应用程序相同的位置,您可以考虑使用 Url.Action(...) 及其重载。

    例如。

    string actionRoute = Url.Action("action method name","controller name");
    

    如果要获取完整路径,可以使用:

    string domainRoute = HttpContext.Request.Url.AbsolutePath;
    

    然后将 id 与它连接起来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      相关资源
      最近更新 更多