コントローラでこれを実現したいと仮定すると、いくつかのジャンプがあります。 ViewDataDictionary
とTempDataDictionary
をインスタンス化する必要があります。次に、ControllerContext
を取得し、IView
を作成する必要があります。最後に、これらすべての要素(プラスRouteCollection
)を使用してHtmlHelper
を作成する準備が整いました。
これをすべて完了したら、LinkExtensions.ActionLink
を使用してカスタムリンクを作成できます。あなたの視点では、リンクがHTMLエンコードされないようにするには、@Html.Raw()
を使用する必要があります。ここで必要なコードは次のとおりです。
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対処するため
UPDATE
、私の最初の答えは何ができるかの例でした。開発者はこの技術を再利用する必要がある場合、複雑さはそうように、静的なヘルパーに隠すことができる。
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生成、オンラインドキュメント配信などのモデルとエディタテンプレートを使用してマークアップを生成することが可能です。
どのようなユースケースですか? – tvanfosson
私が望むのは、エラーを解決するためにリンクに「ModelState.AddModelError」を追加することです。 – roncansan