2016-04-13 11 views
1

非常に単純なViewComponentについては、ビューをバイパスし、エンコードされたHTML文字列を返すだけです。ビューコンポーネントから未加工htmlをレンダリング

例:

<ul> 
    <li>One</li> 
    <li>Two</li> 
<ul> 

私の自作の実装は、このようなものです:

public class RawHtmlResult : IViewComponentResult 
{ 
    public RawHtmlResult(string EncodedHtml) 
    { 
     _encodedHtml = EncodedHtml; 
    } 
    public string _encodedHtml { get; set; } 

    public void Execute(ViewComponentContext context) 
    { 
     context.Writer.Write(_encodedHtml); 
    } 

    public Task ExecuteAsync(ViewComponentContext context) 
    { 
     return context.Writer.WriteAsync(_encodedHtml); 
    } 
} 

使用法:

public async Task<IViewComponentResult> InvokeAsync(long id) 
{ 
    var someArray = await _someService(id); 
    var ulHelper = new TagBuilder("ul"); 
    var liHelper = new TagBuilder("li"); 

    foreach (var setName in someArray) 
    { 
     liHelper = new TagBuilder("li"); 
     liHelper.InnerHtml.Append(setName); 
     ulHelper.InnerHtml.Append(liHelper); 
    } 
    var writer = new System.IO.StringWriter(); 
    ulHelper.WriteTo(writer, new HtmlEncoder()); 

    return new RawHtmlResult(writer.ToString()); 
} 

これまでのところ私は、適切なIViewComponentResultを発見していません。私はapointが欠けていますか?

+0

見る*はマークアップと混合し、*生のHTMLです。コントローラーはレンダリングに何もしなくてはなりません。それ以外の場合は、MVCを使用しないでください。間違ったパターンです。おそらくあなたは*別の問題を解決しようとしていますか?なぜ、MVCフレームワークの中で、このような生のHTMLを作成したいのですか? –

+0

たぶん彼はCMSを開発していて、彼の記事はHTML形式でデータベースに保存されていますか? ;) – Tseng

+0

あなたは 'HtmlString'を調べることもできます。エンコードされているタグヘルパーのコンテンツに対して少し違った答えを使用しました。 http://stackoverflow.com/a/35672341/455493コントローラー内での使用方法についてはよく分かりません。 – Tseng

答えて

1
return Content("<ul><li>One</li><li>Two</li><ul>"); 

方法がController.Contentです。また、これを使用して、HTML以外のコンテンツタイプを返すこともできます。

前述のように、HTMLを返すのが好ましい方法ではありません。通常、コントローラはモデルを返し、ビューはHTMLを提供する必要があります。部分的なビューを使用することが望ましい場合があります。しかし、このようなことをしなければならないところでシナリオが現れます。 (私はちょうど1を自分自身に遭遇しました。)

+0

2番目の引数content typeを指定する必要があります。 'Content(html、" text/html ") – Chris

+0

2番目の引数はオプションです。 –

+0

コンテンツタイプを省略すると、常にtext/plainが返されますが、チェックしただけで正しいコンテンツタイプが返されるという印象を受けました。多分、それはMVC3以来の新しいものです。 – Chris

2

ビューコンポーネントのInvoke()方法は、それはあなたがIViewComponentResultのカスタム実装を必要としないHtmlStringを返すことができ、IViewComponentResultを返す必要はありません。例えば

public HtmlString Invoke() 
{ 
    return new HtmlString(@"<b>Hello World</b>"); 
} 
関連する問題