說我想從我的MVC應用程序發送包含鏈接回到項目的電子郵件。以編程方式獲取ASP.NET MVC應用程序的控制器地址
所以我想在我的控制器是這樣的:
string link = "www.mysite/mycontroller/itemdetails/23";
我可以檢索這個編程所以它適用於任何服務器/配置我碰巧堅持下去嗎?
如
string link = GetCurrentActionRoute() + "23";
說我想從我的MVC應用程序發送包含鏈接回到項目的電子郵件。以編程方式獲取ASP.NET MVC應用程序的控制器地址
所以我想在我的控制器是這樣的:
string link = "www.mysite/mycontroller/itemdetails/23";
我可以檢索這個編程所以它適用於任何服務器/配置我碰巧堅持下去嗎?
如
string link = GetCurrentActionRoute() + "23";
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();
}
我用從我的控制器類下面的擴展方法來生成鏈接到各種動作。
例子:
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();
}
}
Simon Steele,你已經給出了很好的答案。我一直在尋找它幾個星期。想知道爲什麼其他人在這個論壇上,沒有感謝你的答案。 – 2013-07-30 08:22:43
如果該鏈接將指向同一位置的應用程序,你可以考慮使用Url.Action(。 ..)及其過載。
例如,
string actionRoute = Url.Action("action method name","controller name");
如果你想獲得完整的路徑,你可以使用:
string domainRoute = HttpContext.Request.Url.AbsolutePath;
,然後與串聯的ID。
鏈接和您的應用程序從您所指的位置託管在同一臺服務器上? – 2010-09-22 12:12:45