2017-08-04 27 views
1

以前にMVC5で行ったことと同様に、ASP.NETコアでIHtmlContentまたはHtmlStringを作成する方法を示す人がいるかどうかは疑問です。また@Html.MenuLink("Home", "Home", "Index", "", "Home")ビューの上部に@using WebApplication1.Helpersを含めることだろうViewで使用するにはASP.NETコアでMVC5 MvcHtmlStringを作成する方法

HtmlExtender.cs

:私は、通常そのようにヘルパークラス内の新しいMvcHtmlStringメソッドを宣言します。

HtmlStringまたはIHtmlContentを使用して私が必要とするものを実現するのは不安ですが、私のメソッドではHttpContextAccessorへのアクセスが必要ですが、これを行う方法は少し不明です。

Startup.csでHttpContextAccessorを宣言しましたが、ASP.NET Core 2.0ではデフォルトでは宣言されていませんが、ヘルパーメソッド内での使用方法を支援する必要があります。

Startup.csは

public void ConfigureServices(IServiceCollection serviceCollection) 
{ 
    serviceCollection.AddMvc(); 
    serviceCollection.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 
} 

すべてのヘルプははるかにMVCコアの新しいプリミティブがいいと使いやすい

答えて

1

:-)いただければ幸いです。 TagBuilderは、現在MvcHtmlStringを使用しているすべての場所で使用できるIHtmlContentを実装しています。上の例では、MvcHtmlString.Createを削除し、TagBuilderを直接返します(IHtmlContentを返すように調整する)。

その他の有用なクラスは、IHtmlContentを返す別のタイプのHtmlContentBuilderで、AppendHtmlはStringBuilderに似ていますが、HTMLコンテンツ専用です。あなたは非常に便利な多くのタグビルダーを追加することができます。

これは理論的にはあなたが後にしていることです(私はこのGetUrlHelper拡張が他の場所で見つかっています、どこを忘れています)。

public static IUrlHelper GetUrlHelper(this IHtmlHelper html) 
    { 
     var urlFactory = html.ViewContext.HttpContext.RequestServices.GetRequiredService<IUrlHelperFactory>(); 
     var actionAccessor = html.ViewContext.HttpContext.RequestServices.GetRequiredService<IActionContextAccessor>(); 
     return urlFactory.GetUrlHelper(actionAccessor.ActionContext); 
    } 
    public static IHtmlContent MenuLink(this IHtmlHelper htmlHelper, string linkText, string controller, string action, string area, string anchorTitle) 
    { 

     var urlHelper = htmlHelper.GetUrlHelper(); 

     var url = urlHelper.Action(action, controller, new { area }); 

     var anchor = new TagBuilder("a"); 
     anchor.InnerHtml.Append(linkText); 
     anchor.MergeAttribute("href", url); 
     anchor.Attributes.Add("title", anchorTitle); 

     var listItem = new TagBuilder("li"); 
     listItem.InnerHtml.AppendHtml(anchor); 

     if (CheckForActiveItem(htmlHelper, controller, action, area)) 
     { 
      listItem.GenerateId("menu_active", "_"); 
     } 

     return listItem; 
    } 
関連する問題