Asp.net mvc 以编程方式获取ASP.NET MVC应用程序的控制器地址

Asp.net mvc 以编程方式获取ASP.NET MVC应用程序的控制器地址,asp.net-mvc,asp.net-mvc-2,asp.net-mvc-routing,Asp.net Mvc,Asp.net Mvc 2,Asp.net Mvc Routing,假设我想从我的MVC应用程序发送一封电子邮件,其中包含指向某个项目的链接 因此,我希望控制器中有如下内容: string link = "www.mysite/mycontroller/itemdetails/23"; 我是否可以通过编程方式检索它,以便它在我使用的任何服务器/配置上都能正常工作 乙二醇 我使用下面控制器类中的扩展方法来生成指向各种操作的链接 示例: string link = this.Action("Play"); string fullLink = this.FullU

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

因此,我希望控制器中有如下内容:

string link = "www.mysite/mycontroller/itemdetails/23"; 
我是否可以通过编程方式检索它,以便它在我使用的任何服务器/配置上都能正常工作

乙二醇


我使用下面控制器类中的扩展方法来生成指向各种操作的链接

示例:

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();
    }
}
//
///控制器类的助手扩展。
/// 
公共静态类控制器扩展
{
/// 
///获取控制器的操作链接。
/// 
///控制器实例。
///为提供链接的操作。
///操作的链接Url。
公共静态字符串操作(此控制器,字符串操作)
{
RouteValueDictionary rvd=新RouteValueDictionary
{
{“controller”,controller.GetType().Name},
{“行动”,行动}
};
返回RouteTable.Routes.GetVirtualPath(controller.ControllerContext.RequestContext,rvd).VirtualPath;
}
/// 
///获取控制器的操作链接。
/// 
///控制器实例。
///动作名称。
///动作参数。
///带有参数的操作的链接Url。
公共静态字符串操作(此控制器、字符串操作、对象参数)
{
字符串controllerName=controller.GetType().Name;
if(controllerName.EndsWith(“Controller”))
{
controllerName=controllerName.Substring(0,controllerName.Length-10);
}
返回控制器动作(控制器名称、动作、参数);
}
/// 
///获取控制器的操作链接。
/// 
///控制器实例。
///行动的目标控制器。
///动作名称。
///动作参数。
///给定控制器上操作的链接Url。
公共静态字符串操作(此控制器控制器、字符串targetController、字符串操作、对象参数)
{
RouteValueDictionary rvd=新的RouteValueDictionary(参数)
{
{“控制器”,targetController},
{“行动”,行动}
};
返回RouteTable.Routes.GetVirtualPath(controller.ControllerContext.RequestContext,rvd).VirtualPath;
}
/// 
///获取控制器的完全限定操作链接。
/// 
///控制器实例。
///动作名称。
///动作参数。
///当前请求URI。
///完全限定链接Url。
公共静态字符串FullUrlAction(此控制器控制器、字符串操作、对象参数、Uri请求URL)
{
字符串controllerName=controller.GetType().Name;
if(controllerName.EndsWith(“Controller”))
{
controllerName=controllerName.Substring(0,controllerName.Length-10);
}
返回controller.FullUrlAction(controllerName、action、参数、requestUrl);
}
/// 
///获取控制器的完全限定操作链接。
/// 
///控制器实例。
///行动的目标控制器。
///动作名称。
///动作参数。
///当前请求URI。
///完全限定链接Url。
公共静态字符串FullUrlAction(此控制器控制器、字符串targetController、字符串操作、对象参数、Uri请求URL)
{
string testUrl=virtualpathulity.ToAbsolute(controller.Action(targetController,Action,parameters));
返回新的Uri(requestUrl,testUrl).ToString();
}
}

我使用以下控制器类中的扩展方法生成指向各种操作的链接

示例:

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();
    }
}
//
///控制器类的助手扩展。
/// 
公共静态类控制器扩展
{
/// 
///获取控制器的操作链接。
/// 
///控制器实例。
///为提供链接的操作。
///操作的链接Url。
公共静态字符串操作(此控制器,字符串操作)
{
RouteValueDictionary rvd=新RouteValueDictionary
{
{“controller”,controller.GetType().Name},
{“行动”,行动}
};
返回RouteTable.Routes.GetVirtualPath(controller.ControllerContext.RequestContext,rvd).VirtualPath;
}
/// 
///获取控制器的操作链接。
/// 
///控制器实例。
///动作名称。
///动作参数。
///带有参数的操作的链接Url。
公共静态字符串操作(此控制器、字符串操作、对象参数)
{
字符串controllerName=controller.GetType().Name;
if(controllerName.EndsWith(“Controller”))
{
controllerName=controllerName.Substring(0,controllerName.Length-10);
}
返回控制器动作(控制器名称、动作、参数);
}
/// 
///获取控制器的操作链接。
/// 
///控制器实例。
///行动的目标控制器。
///动作名称。
///动作参数。
///给定控制器上操作的链接Url。
公共静态字符串操作(此控制器控制器、字符串targetController、字符串操作、对象参数)
{
RouteValueDictionary rvd=新的RouteValueDictionary(参数)
{
{“控制器”,targetController},
{“行动”,行动}
};
返回路线选项卡
string actionRoute = Url.Action("action method name","controller name");
string domainRoute = HttpContext.Request.Url.AbsolutePath;