Mam niestandardową implementację bloku, który działa podobnie do Html.BeginForm()
. Realizacja jest w zasadzie w sposób następujący:Brzytwa: niestandardowy BeginForm() - jak jednorazowy blok Razor nie działa w niektórych przypadkach
public class MyBlock : IDisposable {
private readonly HtmlHelper _html;
public MyBlock(HtmlHelper hml) {
this._html.ViewContext.Writer.WriteLine("BEGIN");
}
public void Dispose() {
this._html.ViewContext.Writer.WriteLine("END");
}
}
Wtedy moim zdaniem można zrobić:
@using (new MyBlock(Html)) {
@: some content
}
Aby uzyskać:
BEGIN
some content
END
to wszystko działa dobrze. Jednak napotkam problemy, gdy używam mojego bloku wewnątrz "fragmentu maszynki do golenia", np. sol. przy przekazywaniu zawartości brzytwy do funkcji, która przyjmuje argument Func<object, HelperResult>
. Na przykład, mam inna funkcja HtmlHelper zdefiniowane następująco:
public static IHtmlString Content(this HtmlHelper @this, Func<object, HelperResult> razor) {
return razor(null);
}
@* use in a view as: *@
@{
var razorContent = Html.Content(@<div>Some razor content</div>);
}
@razorContent
Kiedy wykonać następujące czynności, choć wewnętrzna treść świadczy bez zewnętrznej treści:
@{
var content =Html.Content(
@<text>
@using (new MyBlock(Html)) {
@: some content 2
}
<text>
);
}
@content
Myślę, że problemem jest to, że " Html "nadal odnosi się do HtmlHelper z zewnętrznego kontekstu, a zatem BEGIN i END są wysyłane do różnych pisarzy niż" niektóre treści 2 ", jednak nie jestem pewien, czy tak jest.
Czy ktoś wie (1), co dzieje się nie tak i (2) jak mogę to naprawić?
Moim celem jest uchwycenie zmiennej treści w IHtmlString, która może zostać przekazana gdzie indziej. To nie wygląda na to, że rozwiązuje ten problem, prawda? – ChaseMedallion