Программно получить адрес контроллера приложения ASP.NET MVC - PullRequest
1 голос
/ 22 сентября 2010

Скажем, я хочу отправить электронное письмо из моего приложения MVC, содержащее ссылку на элемент.

Итак, я хочу что-то в моем контроллере, например:

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

могу ли я получить это программно, чтобы оно работало на любом сервере / конфигурации, на которой я остановился?

например

string link = GetCurrentActionRoute() + "23";

Ответы [ 3 ]

3 голосов
/ 22 сентября 2010
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 голосов
/ 22 сентября 2010

Если ссылка будет указывать на то же местоположение, что и приложение, вы можете рассмотреть возможность использования действия Url.Action (...) и его перегрузок.

Например.

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

Если вы хотите получить полный путь, вы можете использовать:

string domainRoute = HttpContext.Request.Url.AbsolutePath;

и затем объединить идентификатор с этим.

2 голосов
/ 22 сентября 2010

Я использую приведенные ниже методы расширения из своих классов контроллера для генерации ссылок на различные действия.

Примеры:

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