12

Je souhaite écrire un HtmlHelper pour rendre un ActionLink avec des valeurs prédéfinies, par exemple.Utilisation de Html.ActionLink et Url.Action (...) depuis le contrôleur

<%=Html.PageLink("Page 1", "page-slug");%> 

PageLink est une fonction qui appelle ActionLink avec une action connue et contrôleur, par exemple. "Index" et "Page".

Puisque HtmlHelper et UrlHelper n'existent pas dans une classe Controller, comment puis-je obtenir l'URL relative d'une action à l'intérieur d'une classe?

Mise à jour: Compte tenu des trois années d'expérience accumulées supplémentaires que j'ai maintenant, voici mon conseil: il suffit d'utiliser Html.ActionLink("My Link", new { controller = "Page", slug = "page-slug" }) ou mieux encore,

<a href="@Url.Action("ViewPage", 
        new { 
          controller = "Page", 
          slug = "my-page-slug" })">My Link</a> 

Votre méthode d'extension peut être mignon et court, mais il ajoute un autre point de non-test non testé et une nouvelle exigence d'apprentissage pour les embauches sans ajouter aucune valeur réelle. Pensez-y comme la conception d'un système complexe. Pourquoi ajouter une autre partie mobile, sauf si elle ajoute la fiabilité (non), la lisibilité (peu, une fois que vous avez lu plus docs), la vitesse (aucun) ou la concurrence (aucun).

+0

+1 pour la mise à jour. Je voudrais également pointer les futurs chercheurs à cette question en appelant 'Url.Action' de l'intérieur du contrôleur - http://stackoverflow.com/questions/2031995/call-urlhelper-in-models-in-asp-net-mvc – brichins

Répondre

20

Je ne suis pas sûr d'avoir bien compris votre question, mais laissez-moi essayer.

Pour créer une extension HtmlHelper comme vous avez décrit, essayez quelque chose comme:

using System; 
using System.Web.Mvc; 
using System.Web.Mvc.Html; 

namespace Something { 
    public static class PageLinkHelper 
    { 
     public static string PageLink(
      this HtmlHelper helper, 
      string linkText, string actionName, 
      string controllerName, object routeValues, 
      object htmlAttributes) 
     { 
      return helper.ActionLink(
       linkText, actionName, controllerName, 
       routeValues, htmlAttributes); 
     } 
    } 
} 

Quant à votre question sur l'obtention d'une URL d'une classe, dépend de quel type de classe que vous allez le mettre en œuvre. Par exemple, si vous voulez obtenir le régulateur de courant et de l'action d'une extension HtmlHelper, vous pouvez utiliser:

string currentControllerName = (string)helper.ViewContext 
    .RouteData.Values["controller"]; 
string currentActionName = (string)helper.ViewContext 
    .RouteData.Values["action"]; 

Si vous voulez l'obtenir à partir d'un contrôleur, vous pouvez utiliser les propriétés/méthodes de la classe de base (Controller) pour créer l'URL. Par exemple:

var url = new UrlHelper(this.ControllerContext.RequestContext); 
url.Action(an_action_name, route_values); 
+1

Excellent répondre. J'ai essayé cela sans l'encapsuler dans une classe statique et il ne s'enregistrerait pas helper.ActionLink (...). Merci. –

+0

Ah, et je n'importais pas System.Web.Mvc; Ma faute. –