Ответ 1
Предполагая, что вы хотите выполнить это в своем контроллере, есть несколько обручей, которые нужно перепрыгнуть. Вы должны создать экземпляр 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 для создания ссылки.
UPDATE
Чтобы обратиться к 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 (с полным Intellisense).
Возможности использования включают создание разметки с использованием моделей и шаблонов редакторов для электронных писем, генерации PDF файлов, доставки документов в режиме онлайн и т.д.