J'essaye de créer une aide HTML qui permettra à tout le texte d'une utilisation d'être consommé et non écrit sur la page finale.HtmlHelper pour consommer html/text inside en utilisant
Le rasoir:
<div>
<p>
Before Inline
</p>
@using (Html.IncludeInlineScript("testScript"))
{
<script type="text/javascript">
alert("hello world");
</script>
}
<p>
After Inline
</p>
</div>
Le code HTML résultant:
<div>
<p>
Before Inline
</p>
<script type="text/javascript">
alert("hello world");
</script>
<!-- Top of Dispose -->
<!-- Bottom of Dispose -->
<p>
After Inline
</p>
</div>
L'extension Helper Méthode:
public static ScriptWrapper IncludeInlineScript(this HtmlHelper helper, string scriptName)
{
return new ScriptWrapper(helper);
}
Le Wrapper:
public class ScriptWrapper : IDisposable
{
private HtmlHelper _helper;
private TextWriter _originalWriter;
private StringBuilder _scriptContents;
public ScriptWrapper(HtmlHelper helper)
{
_helper = helper;
_originalWriter = _helper.ViewContext.Writer;
_scriptContents = new StringBuilder();
_helper.ViewContext.Writer = new StringWriter(_scriptContents);
}
public void Dispose()
{
_originalWriter.WriteLine("<!-- Top of Dispose -->");
_helper.ViewContext.Writer.Flush();
_helper.ViewContext.Writer = _originalWriter;
_originalWriter.WriteLine("<!-- Bottom of Dispose -->");
}
}
Le problème ici est que, malgré le réglage du ViewContext.Writer
à un nouveau TextWriter, il écrit toujours à l'écrivain d'origine. Clairement la disposition est invoquée dans le bon ordre comme le haut de la disposition est après le script. Pendant le débogage après que le nouvel éditeur a été défini, le bloc <script>
ne figure pas dans le flux, mais au moment de la disposition, le <script>
est maintenant contenu dans le programme d'origine.
Le moteur de rasoir conserve-t-il une copie locale de l'enregistreur et ignore le fait qu'il a été réglé sur une instance différente? Cela semble être un bug pour moi.
Ce que vous avez dit serait correct si le TextWriter que j'ai créé a écrit cette valeur dans son constructeur de chaîne. Au lieu de cela l'auteur d'origine a obtenu la valeur en dépit de ne plus être attaché à ViewContent. Je pense toujours que c'est un défaut dans le cadre MVC5. – VulgarBinary