2010-09-22 58 views
1

說我想從我的MVC應用程序發送包含鏈接回到項目的電子郵件。以編程方式獲取ASP.NET MVC應用程序的控制器地址

所以我想在我的控制器是這樣的:

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

我可以檢索這個編程所以它適用於任何服務器/配置我碰巧堅持下去嗎?

string link = GetCurrentActionRoute() + "23"; 
+0

鏈接和您的應用程序從您所指的位置託管在同一臺服務器上? – 2010-09-22 12:12:45

回答

3
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

我用從我的控制器類下面的擴展方法來生成鏈接到各種動作。

例子:

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(); 
    } 
} 
+0

Simon Steele,你已經給出了很好的答案。我一直在尋找它幾個星期。想知道爲什麼其他人在這個論壇上,沒有感謝你的答案。 – 2013-07-30 08:22:43

2

如果該鏈接將指向同一位置的應用程序,你可以考慮使用Url.Action(。 ..)及其過載。

例如,

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

如果你想獲得完整的路徑,你可以使用:

string domainRoute = HttpContext.Request.Url.AbsolutePath; 

,然後與串聯的ID。

相關問題