Вопрос

Я хочу вызвать метод @html.actionLink внутри функции AC#, чтобы вернуть строку по ссылке.

Что-то вроде этого:

string a = "Email is locked, click " + @Html.ActionLink("here to unlock.", "unlock") ;
Это было полезно?

Решение

Предполагая, что вы хотите сделать это в своем контроллере, есть несколько обручей, через которые можно прыгнуть. Вы должны создать экземпляр ViewDataDictionary и TempDataDictionary. Анкет Тогда вам нужно взять ControllerContext и создать IView. Анкет Наконец, вы готовы создать свой HtmlHelper используя все эти элементы (плюс ваш RouteCollection).

Как только вы все это сделаете, вы можете использовать LinkExtensions.ActionLink Чтобы создать свою пользовательскую ссылку. По вашему мнению, вам нужно будет использовать @Html.Raw() Чтобы отобразить свои ссылки, чтобы они не были закодированы HTML. Вот необходимый код:

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

Показав все это, я предостерегаю вас, что это гораздо лучшая идея, чтобы сделать это, по вашему мнению. Добавьте ошибку и другую информацию в свой ViewModel, затем кодируйте свое представление, чтобы создать ссылку. Если это необходимо для нескольких просмотров, создайте HTMlHelper, чтобы сделать создание ссылок.

ОБНОВИТЬ

Чтобы адресовать one.beat.consumer, мой первоначальный ответ был примером того, что возможно. Если разработчик необходимо повторно использовать эту технику, сложность может быть скрыта в статическом помощнике, например, так:

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;
    }
}

Затем в контроллере он используется так:

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

или как так:

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

Хотя это проще в использовании Url.Action, Теперь это распространяется на мощный инструмент для создания любой наценки в контроллере, используя все HTMlHelpers (с полным интеллектом).

Возможности использования включают генерацию разметки с использованием моделей и шаблонов редактора для электронных писем, генерации PDF, онлайн-доставки документов и т. Д.

Другие советы

Вы можете создать метод расширения HTMLHelper:

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

Или, если вы хотите генерировать эту ссылку за пределами объема страницы ASPX, вам необходимо создать ссылку на HTMLHelper, а затем генерировать. Я делаю это в UrlUtility Статический класс (я знаю, люди ненавидят статические классы и утилиту слова, но стараются сосредоточиться). Перегрузка по мере необходимости:

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

Затем вы можете написать следующее, где ваше сердце желает:

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

Есть несколько вещей в этих других ответах ...

Ответ Акулы требует, чтобы вы внесли пространство имен Linkextensions в C#, что неверно, но нежелательно для меня.

Идея Хантера создать помощника лучше, но все же писать вспомогательную функцию для одного URL -адреса является громоздкой. Вы можете написать помощника, чтобы помочь вам построить строки, которые приняли параметры, или вы можете просто сделать это старым способом:

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

@counsellorben,

Я не вижу причин для сложности; Пользователь хочет только представить маршрутизацию действия в жесткую строку, содержащую якорный тег. Более того, ActionLink () в жестко написанной конкатенированной строке не покупает ни одного ничего, и заставляет разработчика использовать Linkextensions, которые предназначены для представлений.

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

Я все еще стою и рекомендую ответы Twanfosson и я предоставили.

Лучше всего построить ссылку вручную, используя Urlhelper, доступный в контроллере. Сказав это, я подозреваю, что, вероятно, есть лучший способ справиться с этим в виде или частичного взгляда, общего или иного.

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

Может попробовать это:

string a = "Email is locked, click " + System.Web.Mvc.Html.LinkExtensions.ActionLink("here to unlock.", "unlock");
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top