3

私は、このカスタムタグヘルパーを書く上でのこの記事に続きましたhereASP.NETコアカスタムタグヘルパー内のビューを使用するには?

iは要素マークアップは、ハードC位

(上記のリンクから採取した)例

public override void Process(TagHelperContext context, TagHelperOutput output) 
{ 
    output.TagName = "section"; 
    output.Content.SetHtmlContent(
     [email protected]"<ul><li><strong>Version:</strong> {Info.Version}</li> 
     <li><strong>Copyright Year:</strong> {Info.CopyrightYear}</li> 
     <li><strong>Approved:</strong> {Info.Approved}</li> 
     <li><strong>Number of tags to show:</strong> {Info.TagsToShow}</li></ul>"); 
    output.TagMode = TagMode.StartTagAndEndTag; 
} 

の代わりにこれを行うことで符号化されたコード、iをロードすることができる方法がある参照ごとcshtmlファイルのマークアップテンプレート? (パーシャルビューを読み込むのと同じようなもの)

私は、個々のファイルタイプ(各要素タイプに1つずつ)を持っているので、簡単にスタイルを設定できます。また、私のC#はきれいに見えます!

おかげで、

ジェームズ

+0

コンポーネント](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-components)がオプションになる可能性があります。 –

+0

、[ビューわからhelper.Partial' 'のようなヘルパーオブジェクトを呼び出すことはできませんが、MVCで

[HtmlTargetElement("mylist")] public class MyListTagHelper : TagHelper { private HtmlHelper _htmlHelper; private HtmlEncoder _htmlEncoder; public MyListTagHelper(IHtmlHelper htmlHelper, HtmlEncoder htmlEncoder) { _htmlHelper = htmlHelper as HtmlHelper; _htmlEncoder = htmlEncoder; } public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) { output.TagName = "section"; output.TagMode = TagMode.StartTagAndEndTag; var partial = await _htmlHelper.PartialAsync("TagHelpers/MyList", Info); var writer = new StringWriter(); partial.WriteTo(writer, _htmlEncoder); output.Content.SetHtmlContent(writer.ToString()); } } 
juunas

答えて

0

私はこのような何かを実装しましたが、それは依存性注入を使用してカスタムViewRenderingサービスを作成し、文字列にビューをレンダリングすることを利用したアプローチについてのラウンドを取ります。私はこのアプローチが好きです。なぜなら、私のアプリでは、電子メールのテンプレート、タグヘルパー、およびビューをコードで使用するために文字列にレンダリングする必要がある場合など、ビューを使用してモデルを渡すことができるからです。より動的な要素のビュー。あなたは、

public void ConfigureServices(IServiceCollection services) 
    { 
     ... 

     services.AddTransient<IViewRenderService, ViewRenderService>(); 

     ... 
    } 

最後に、あなたのStartup.csで次に

using Microsoft.AspNetCore.Http; 
using Microsoft.AspNetCore.Mvc; 
using Microsoft.AspNetCore.Mvc.Abstractions; 
using Microsoft.AspNetCore.Mvc.ModelBinding; 
using Microsoft.AspNetCore.Mvc.Razor; 
using Microsoft.AspNetCore.Mvc.Rendering; 
using Microsoft.AspNetCore.Mvc.ViewFeatures; 
using Microsoft.AspNetCore.Routing; 
using System; 
using System.IO; 

public class ViewRenderService : IViewRenderService 
{ 
    private readonly IRazorViewEngine _viewEngine; 
    private readonly ITempDataProvider _tempDataProvider; 
    private readonly IServiceProvider _serviceProvider; 

    public ViewRenderService(IRazorViewEngine viewEngine, ITempDataProvider tempDataProvider, IServiceProvider serviceProvider) 
    { 
     _viewEngine = viewEngine; 
     _tempDataProvider = tempDataProvider; 
     _serviceProvider = serviceProvider; 
    } 

    public string RenderView(string viewName) 
    { 
     var actionContext = GetActionContext(); 

     var viewEngineResult = _viewEngine.FindView(actionContext, viewName, false); 

     if (!viewEngineResult.Success) 
     { 
      throw new InvalidOperationException(string.Format("Couldn't find view '{0}'", viewName)); 
     } 

     var view = viewEngineResult.View; 

     using (var output = new StringWriter()) 
     { 
      var viewContext = new ViewContext(
       actionContext, 
       view, 
       new ViewDataDictionary(
        metadataProvider: new EmptyModelMetadataProvider(), 
        modelState: new ModelStateDictionary()), 
       new TempDataDictionary(
        actionContext.HttpContext, 
        _tempDataProvider), 
       output, 
       new HtmlHelperOptions()); 

      view.RenderAsync(viewContext).GetAwaiter().GetResult(); 

      return output.ToString(); 
     } 
    } 

    public string RenderView<TModel>(string viewName, TModel model) 
    { 
     var actionContext = GetActionContext(); 

     var viewEngineResult = _viewEngine.FindView(actionContext, viewName, false); 

     if (!viewEngineResult.Success) 
     { 
      throw new InvalidOperationException(string.Format("Couldn't find view '{0}'", viewName)); 
     } 

     var view = viewEngineResult.View; 

     using (var output = new StringWriter()) 
     { 
      var viewContext = new ViewContext(
       actionContext, 
       view, 
       new ViewDataDictionary<TModel>(
        metadataProvider: new EmptyModelMetadataProvider(), 
        modelState: new ModelStateDictionary()) 
       { 
        Model = model 
       }, 
       new TempDataDictionary(
        actionContext.HttpContext, 
        _tempDataProvider), 
       output, 
       new HtmlHelperOptions()); 

      view.RenderAsync(viewContext).GetAwaiter().GetResult(); 

      return output.ToString(); 
     } 
    } 

    private ActionContext GetActionContext() 
    { 
     var httpContext = new DefaultHttpContext(); 
     httpContext.RequestServices = _serviceProvider; 
     return new ActionContext(httpContext, new RouteData(), new ActionDescriptor()); 
    } 
} 

ます:サービスの

public interface IViewRenderService 
{ 
    string RenderView(string viewName); 

    string RenderView<TModel>(string viewName, TModel model); 

} 

実施(重要な部分):

インターフェイスサービスを定義しますこのようなコード(この例ではコントローラ)でこれを使用してください:

public class TestController : Controller 
{ 
    private IViewRenderService viewRenderService; 

    public TestController(IViewRenderService _viewRenderService) 
    { 
     viewRenderService = _viewRenderService; 
    } 

    public async Task<IActionResult> Index() 
    { 
     // code 

     var stringOfView = viewRenderService.RenderView("EmailTemplate/EmailConfirmation"); 

     // code that does something with the view as a string 

     return View(); 
    } 
} 

あなたは、自分のフォルダの下に[ビュー]フォルダで、あなたのビューを置くことができます(ビューのパス上の例では、このようにある:/Views/EmailTemplate/EmailConfirmation.cshtml)

ビューがモデルあなたを必要とする場合

var stringOfView = viewRenderService.RenderView("folder/view", model); 

これは役に立ちます。

0

部分ビューを作成し、TagHelperクラスから呼び出すことができます。たとえば、次のように

あなた TagHelper
<!-- Views/Shared/TagHelpers/MyList.cshtml --> 
@model YourInfoClass 
<ul> 
    <li><strong>Version:</strong> @Model.Version</li> 
    <li><strong>Copyright Year:</strong> @Model.CopyrightYear</li> 
    <li><strong>Approved:</strong> @Model.Approved</li> 
    <li><strong>Number of tags to show:</strong> @Model.TagsToShow</li> 
</ul> 

私たちはあなたのニーズに応じてasp.netコア
+0

これは有望に見えます、試してみましょう - ありがとう! –

関連する問題