web-dev-qa-db-fra.com

Générer une URL dans l'assistant HTML

Normalement, dans une vue ASP.NET, vous pouvez utiliser la fonction suivante pour obtenir une URL (et non un <a>):

Url.Action("Action", "Controller");

Cependant, je ne trouve pas comment le faire à partir d'un assistant HTML personnalisé. j'ai

public class MyCustomHelper
{
   public static string ExtensionMethod(this HtmlHelper helper)
   {
   }
}

La variable d'assistance a les méthodes Action et GenerateLink, mais elles génèrent <a> 'S. J'ai fouillé dans le code source ASP.NET MVC, mais je n'ai pas trouvé de solution simple.

Le problème est que l’URL ci-dessus est un membre de la classe view et que, pour son instanciation, il a besoin de certains contextes et de cartes routières (que je ne veux pas traiter et que je ne suis pas censé le faire). Ou bien, l’instance de la classe HtmlHelper a aussi un contexte qui, je suppose, est soit le souper d’un sous-ensemble des informations de contexte de l’instance Url (mais là encore, je ne veux pas y faire face).

En résumé, je pense que c'est possible, mais comme je peux le voir de toutes les manières possibles, j'implique certaines manipulations avec des éléments ASP.NET plus ou moins internes, je me demande s'il existe une meilleure solution.

Edit: Par exemple, une possibilité que je vois serait:

public class MyCustomHelper
{
    public static string ExtensionMethod(this HtmlHelper helper)
    {
        UrlHelper urlHelper = new UrlHelper(helper.ViewContext.RequestContext);
        urlHelper.Action("Action", "Controller");
    }
}

Mais cela ne semble pas juste. Je ne veux pas avoir affaire à des exemples de UrlHelper moi-même. Il doit y avoir un moyen plus facile.

167
Jan Zich

Vous pouvez créer url helper comme ceci dans la méthode d'extension html helper:

var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
var url = urlHelper.Action("Home", "Index")
214
Darin Dimitrov

Vous pouvez également obtenir des liens en utilisant UrlHelper public et static class:

UrlHelper.GenerateUrl(null, actionName, controllerName, null, null, null, routeValues, htmlHelper.RouteCollection, htmlHelper.ViewContext.RequestContext, true)

Dans cet exemple, vous n'avez pas à créer de nouvelle classe UrlHelper, ce qui pourrait constituer un petit avantage.

21
cryss

Voici ma toute petite méthode d'extension pour obtenir UrlHelper d'une instance HtmlHelper:

  public static partial class UrlHelperExtensions
    {
        /// <summary>
        /// Gets UrlHelper for the HtmlHelper.
        /// </summary>
        /// <param name="htmlHelper">The HTML helper.</param>
        /// <returns></returns>
        public static UrlHelper UrlHelper(this HtmlHelper htmlHelper)
        {
            if (htmlHelper.ViewContext.Controller is Controller)
                return ((Controller)htmlHelper.ViewContext.Controller).Url;

            const string itemKey = "HtmlHelper_UrlHelper";

            if (htmlHelper.ViewContext.HttpContext.Items[itemKey] == null)
                htmlHelper.ViewContext.HttpContext.Items[itemKey] = new UrlHelper(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection);

            return (UrlHelper)htmlHelper.ViewContext.HttpContext.Items[itemKey];
        }
    }

Utilisez-le comme:

public static MvcHtmlString RenderManagePrintLink(this HtmlHelper helper, )
{    
    var url = htmlHelper.UrlHelper().RouteUrl('routeName');
    //...
}

(Je publie ceci est pour référence seulement)

10
Kibria