1

カスタムレンダラーをMVCビューでラムダとして定義し、パーシャルで使用して同じものを複数回レンダリングできるようにします。ビューデータに保存する予定です。これまで、レンダラーを格納するためにこの拡張メソッドを作成しました。

public static class HtmlHelperExtensions
{
   public static void DefineRenderer<TModel>(this HtmlHelper<TModel> html, string rendererName, Action renderer)
   {
      html.ViewData["_Renderer" + rendererName] = renderer;
   }
}

ビューでレンダラーを定義しようとしていますが、機能していません。構文がオフになっていると思います。誰かが私がここで間違っていることを教えてもらえますか?呼び出されたときにテスト段落をレンダリングしたいだけです。

@Html.DefineRenderer("AnalysisTableHeader", () => {
    <p>test paragraph</p>
@});
4

3 に答える 3

1

DefineRenderer-method は void 以外のものを返す必要があります。たとえば、IHtmlStringかみそりの@-syntax で呼び出すには、次のように呼び出す必要があります。

@{
    Html.DefineRenderer("AnalysisTableHeader", () => {
        <p>test paragraph</p>
    });
}

編集: 申し訳ありませんが、rendererパラメーターのタイプが であることがわかりましSystem.Actionた。私はそれがタイプでなければならないと思います、System.Func<dynamic, HelperResult>そしてあなたはそれを呼び出す必要があります

@{ Html.DefineRenderer("AnalysisTableHeader", @<text><p>test paragraph</p></text>); }

例えば。その後、次のようにレンダリングできますrender(null).ToHtmlString()。とにかく、ビューでこのようなことを行うと、部分的なビューのキャッシュで問題が発生する可能性があることに注意してください。

于 2013-03-12T13:49:28.013 に答える
0

それが必要かどうかはまだ100%わかりませんが、役立つかもしれません。部分ビューで @helper を定義し、Model の値に基づいてレンダリングするバージョンを決定します。

コードでヘッダー タイプを使用して enum を宣言する

public enum HeaderTypes
{
    AnalysisTable,
    SomethingElse
}

次に、あなたの見解で

@helper RenderHeader(HeaderTypes headerType) {
    switch (headerType)
    {
        case HeaderTypes.AnalysisTable:
            @: <p>your html</p>
            break;
        default: 
            @: <p>default</p>
            break;
    }
}

@RenderHeader(HeaderTypes.None)
@RenderHeader(HeaderTypes.AnalysisTable)

または、文字列値などに基づいて切り替えることもできます。

于 2013-03-12T15:10:16.813 に答える
0

@mariozski のコメントからインスピレーションを得て、やりたい動作を実現することができました。@helperレンダラーとしてa を使用します。パーシャルに渡すモデルには、ヘルパー レンダリングの結果が含まれています。HelperResult。_ したがって、次のようになります。

public class AnalysisResponseTableViewModel {
    public HelperResult HeaderTypeRowRenderer { get; set; }
    public List<AnalysisUserResponseViewModel> Responses { get; set; }
}

次に、呼び出しビューは次のようにパーシャルを呼び出します。

@helper RenderHeaderTypeRow() {
    <tr class="headerTypeRow">
        <td>Header type row</td>
        <td>Goes here</td>
    </tr>
}

@Html.Partial("AnalysisResponseTableContentsPartial",
    new AnalysisResponseTableViewModel {
        Responses = Model.OverallCaseStudyUserResponses,
        HeaderTypeRowRenderer = RenderHeaderTypeRow()
    }
)

最後に、パーシャル自体が次のように「ヘッダー タイプ行」を複数回レンダリングできます。

@Html.Raw(Model.HeaderTypeRowRenderer.ToHtmlString())
@{bool reachedSummaryRows = false;}
@foreach (var response in Model.Responses) {
    if (!reachedSummaryRows && !response.IsPass.HasValue) {
        reachedSummaryRows = true;
        @:@Html.Raw(Model.HeaderTypeRowRenderer.ToHtmlString())
    }

    // other table rows here
}
于 2013-03-12T16:23:06.633 に答える