Question

Je veux appeler la méthode @ Html.ActionLink dans une fonction c # pour retourner une chaîne avec un lien dessus.

Quelque chose comme ceci:

string a = "Email is locked, click " + @Html.ActionLink("here to unlock.", "unlock") ;
Était-ce utile?

La solution

En supposant que vous voulez accomplir dans votre contrôleur, il y a plusieurs cerceaux pour sauter à travers. Vous devez instancier un ViewDataDictionary et un TempDataDictionary. Ensuite, vous devez prendre la ControllerContext et créer un IView. Enfin, vous êtes prêt à créer votre HtmlHelper en utilisant tous ces éléments (plus votre RouteCollection).

Une fois que vous avez fait tout cela, vous pouvez utiliser LinkExtensions.ActionLink pour créer votre lien personnalisé. À votre avis, vous devez utiliser @Html.Raw() pour afficher vos liens, pour les empêcher d'être codé en HTML. Voici le code nécessaire:

var vdd = new ViewDataDictionary();
var tdd = new TempDataDictionary();
var controllerContext = this.ControllerContext;
var view = new RazorView(controllerContext, "/", "/", false, null);
var html = new HtmlHelper(new ViewContext(controllerContext, view, vdd, tdd, new StringWriter()),
     new ViewDataContainer(vdd), RouteTable.Routes);
var a = "Email is locked, click " + LinkExtensions.ActionLink(html, "here to unlock.", "unlock", "controller").ToString();

Après avoir montré tout cela, je vous préviens qu'il est une bien meilleure idée de le faire à votre avis. Ajouter l'erreur et d'autres informations à votre ViewModel, coder alors votre vue de créer le lien. Si cela est nécessaire sur plusieurs points de vue, créer un HtmlHelper faire la création de lien.

UPDATE

Pour adresse one.beat.consumer, ma réponse initiale était un exemple de ce qui est possible. Si les besoins des développeurs de réutiliser cette technique, la complexité peut être caché dans un assistant de statique, comme suit:

public static class ControllerHtml
{
    // this class from internal TemplateHelpers class in System.Web.Mvc namespace
    private class ViewDataContainer : IViewDataContainer
    {
        public ViewDataContainer(ViewDataDictionary viewData)
        {
            ViewData = viewData;
        }

        public ViewDataDictionary ViewData { get; set; }
    }

    private static HtmlHelper htmlHelper;

    public static HtmlHelper Html(Controller controller)
    {
        if (htmlHelper == null)
        {
            var vdd = new ViewDataDictionary();
            var tdd = new TempDataDictionary();
            var controllerContext = controller.ControllerContext;
            var view = new RazorView(controllerContext, "/", "/", false, null);
            htmlHelper = new HtmlHelper(new ViewContext(controllerContext, view, vdd, tdd, new StringWriter()),
                 new ViewDataContainer(vdd), RouteTable.Routes);
        }
        return htmlHelper;
    }

    public static HtmlHelper Html(Controller controller, object model)
    {
        if (htmlHelper == null || htmlHelper.ViewData.Model == null || !htmlHelper.ViewData.Model.Equals(model))
        {
            var vdd = new ViewDataDictionary();
            vdd.Model = model;
            var tdd = new TempDataDictionary();
            var controllerContext = controller.ControllerContext;
            var view = new RazorView(controllerContext, "/", "/", false, null);
            htmlHelper = new HtmlHelper(new ViewContext(controllerContext, view, vdd, tdd, new StringWriter()),
                 new ViewDataContainer(vdd), RouteTable.Routes);
        }
        return htmlHelper;
    }
}

Ensuite, dans un contrôleur, il est utilisé comme ceci:

var a = "Email is locked, click " + 
    ControllerHtml.Html(this).ActionLink("here to unlock.", "unlock", "controller").ToString();

ou comme ceci:

var model = new MyModel();
var text = ControllerHtml.Html(this, model).EditorForModel();

Bien qu'il soit plus facile à utiliser Url.Action, cela étend désormais un outil puissant pour générer une marge dans un contrôleur en utilisant toutes les HtmlHelpers (avec IntelliSense complète).

Les possibilités d'utilisation comprennent la génération à l'aide de balisage des modèles et des modèles pour l'éditeur e-mails, la génération de pdf, livraison de documents en ligne, etc.

Autres conseils

Vous pouvez créer une méthode d'extension HtmlHelper:

public static string GetUnlockText(this HtmlHelper helper)
{
    string a = "Email is locked, click " + helper.ActionLink("here to unlock.", "unlock");
    return a;
}

ou si vous voulez dire pour générer ce lien hors de la portée d'une page ASPX vous devez créer une référence à un HtmlHelper puis générer. Je le fais dans une classe statique UrlUtility (je sais, les gens détestent les classes statiques et le mot utilitaire, mais essayer de se concentrer). Surcharge nécessaire:

public static string ActionLink(string linkText, string actionName, string controllerName)
{
    var httpContext = new HttpContextWrapper(System.Web.HttpContext.Current);
    var requestContext = new RequestContext(httpContext, new RouteData());
    var urlHelper = new UrlHelper(requestContext);

    return urlHelper.ActionLink(linkText, actionName, controllerName, null);
}

Ensuite, vous pouvez écrire ce qui suit où que votre cœur désire:

string a = "Email is locked, click " + UrlUtility.ActionLink("here to unlock.", "unlock", "controller");

Il y a une couple de choses mauvaises sur ces autres réponses ...

La réponse de requin vous oblige à mettre l'espace de noms LinkExtensions en C #, ce qui est faux, mais indésirable pour moi.

L'idée de Hunter de faire une aide est meilleure, mais encore à écrire une fonction d'assistance pour une URL unique est lourd. Vous pouvez écrire un assistant pour vous aider à construire des chaînes qui ont accepté les paramètres, ou vous pouvez simplement le faire à l'ancienne mode:

var link = "Email is... click, <a href=\"" + Url.Action("action") + "\"> to unlock.</a>";

@counsellorben,

Je ne vois aucune raison de la complexité; l'utilisateur ne veut que rendre le routage d'une action en une chaîne dure contenant une balise d'ancrage. De plus, ActionLink () dans une chaîne concaténée dur écrite achète un rien, et les forces du développeur d'utiliser LinkExtensions whidh sont destinés à des vues.

Si l'utilisateur est pur et dur sur l'utilisation ActionLink () ou n'a pas besoin (pour une raison quelconque) pour calculer cette chaîne dans le constructeur, le faire dans une vue est beaucoup mieux.

Je me tiens toujours par et recommander les réponses tvanfosson et je fournis.

Votre meilleur pari est de construire le lien manuellement à l'aide UrlHelper disponible dans le contrôleur. Cela dit, je me méfie qu'il ya probablement une meilleure façon de gérer cela dans une vue ou vue partielle, partagé ou autrement.

string a = "Email is locked, click <a href=\""
              + Url.Action( "unlock" )
              + "\">here to unlock.</a>";

Peut-être essayer ceci:

string a = "Email is locked, click " + System.Web.Mvc.Html.LinkExtensions.ActionLink("here to unlock.", "unlock");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top