170 votes

Générer l'URL dans l'aide HTML

Normalement, dans un ASP.NET la vue que l'on pourrait utiliser la fonction suivante pour obtenir une URL (pas un <a>):

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

Cependant, je ne trouve pas comment le faire d'une assistance HTML personnalisée. J'ai

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

L'aide de la variable a de l'Action et de GenerateLink méthodes, mais ils génèrent <a>'. J'ai fait quelques recherches dans le ASP.NET MVC code source, mais je ne pouvais pas trouver une manière simple.

Le problème est que l'Url ci-dessus est un membre de la classe de la vue et de son instanciation, il a besoin de quelques contextes et des cartes d'itinéraires (que je ne veux pas avoir affaire avec et je ne suis pas censé en tout cas). Sinon, l'instance de la classe HtmlHelper a aussi le contexte qui je suppose est soit souper de sous-ensemble de l'information de contexte de l'Url de l'instance (mais encore une fois je ne veux pas traiter avec elle).

En résumé, je pense que c'est possible, mais depuis toutes les façons que je pouvais voir, impliquent la manipulation avec plus ou moins interne ASP.NET des trucs, je me demande si il ya une meilleure façon.

Edit: Par exemple, une solution 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 il ne semble pas opportun. Je ne veux pas avoir affaire avec les instances de UrlHelper moi-même. Il doit y avoir un moyen plus facile.

220voto

Darin Dimitrov Points 528142

Vous pouvez créer un assistant d'url comme celui-ci dans la méthode d'extension de l'assistant html:

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

22voto

cryss Points 974

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 besoin de créer une nouvelle classe UrlHelper, ce qui pourrait être un petit avantage.

10voto

Kibria Points 1206

Voici ma 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 poste cet an pour référence seulement)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X