10
votes

Comment puis-je modifier l'ensemble du contenu de la page ASP.NET à droite avant sa sortie?

J'ai une page qui a un groupe de commandes utilisateur à ce sujet. Je souhaite pouvoir avoir des "macros" ou des "espaces réservés" directement dans le contenu qui sera remplacé dans mon code. Cela ne devrait pas vraiment importer, mais j'utilise Ektron comme ma CMS.

Y a-t-il des événements de page que je peux accrocher à une chaîne Remplacer sur l'ensemble du contenu de la page rendu, juste avant d'être envoyé au client? P>

Mise à jour forte> p>

Voici le code que je suis en train d'utiliser pour accomplir ceci: P>

protected override void Render(HtmlTextWriter writer)
{
    string content = string.Empty;

    using (var stringWriter = new StringWriter())
    using (var htmlWriter = new HtmlTextWriter(stringWriter))
    {
        // render the current page content to our temp writer
        base.Render(htmlWriter);
        htmlWriter.Close();

        // get the content
        content = stringWriter.ToString();
    }

    // replace our placeholders
    string newContent = content.Replace("$placeholder1$", "placeholder1 data").Replace("$placeholder2$", "placeholder2 data");

    // write the new html to the page
    writer.Write(newContent);
}


0 commentaires

5 Réponses :


8
votes

Avez-vous essayé de remplacer la méthode de rendu? XXX


3 commentaires

Oui, c'est le bon endroit mais est-il possible (et sage) de réinitialiser et de lire le flux?


Vous n'êtes jamais "réinitialiser" le flux car il n'a pas encore été envoyé. Je ne suis pas certain si c'est sage, non, je viens de répondre à la question lol


J'utilise cette méthode maintenant, mais j'attendrai d'accepter la réponse pour voir s'il y a une meilleure solution. Fondamentalement, je laisse la page écrire sur un tampon temp. Modifier le tampon. Remplacez le tampon d'origine avec le modifié.



2
votes

Avez-vous examiné l'événement PRERender dans le cycle de vie?

Avant que cet événement se produise:

• L'objet de la page appelle l'objet EnsurechildControls pour chaque contrôle et pour la page.

• chaque Contrôle limité des données dont la source de données la propriété est définie appelle sa base de données Méthode.

• L'événement du préliminaire se produit Pour chaque contrôle de la page. utiliser le événement pour faire des modifications finales à la Contenu de la page ou de ses contrôles .

Je crois que c'est le dernier endroit où vous pourriez faire quelque chose comme ça. L'événement suivant est SavestaTecomplete , qui, selon la documentation, a ce comportement:

Avant que cet événement ne se produise, ViewState a été enregistré pour la page. et pour tous les contrôles. tout changement à la page ou les contrôles à ce stade sera ignoré. utiliser cet événement Effectuer des tâches qui nécessitent l'état d'affichage être sauvé, mais cela ne fait pas de Modifications des contrôles.

Quote Source: https://www.c-sharscorner.com/uploadfile/8911c4/page-life-cycle-with-examples-in-asp-net/


0 commentaires

0
votes

La réponse simpliste qui me vient à l'esprit consiste à utiliser ASP: commandes littérales pour vos "espaces réservés". Vous pouvez définir leur contenu pendant la charge de la page ou vous pouvez accrocher à l'événement PRERender et les définir alors.


2 commentaires

Malheureusement, je ne peux pas faire cela parce que ces "espaces réservés" seront soumis à des contenus dans un contrôle de l'utilisateur, que je ne peux pas toucher. Donc, au moment où cela me rend, la seule chose que je pouvais espérer faire est de regarder le contenu rendu.


Désolé, j'ai raté le "contrôle de l'utilisateur", mon mauvais. Les contrôles des utilisateurs ont également des événements de préliminaire. Vous devriez pouvoir mettre des propriétés publiques sur vos contrôles utilisateur que la page peut définir, puis les contrôles utilisateur font la substitution.



0
votes

On dirait que vous souhaitez que vous souhaitiez avoir des littéraux HTML dans votre page, puis vous pouvez simplement les remplacer par le contenu approprié de l'événement Page_Load.

Cela vous obligera à rédiger un code HTML, par opposition à un texte simple, mais il semble que vous soyez comme si vous injectionnez votre propre code JavaScript ou similaire, ce qui fonctionnera bien pour.


0 commentaires

5
votes

Il y a deux approches que vous pourriez utiliser:

  1. Ceci est similaire à celui accepté réponse. Mais je recommanderais remplacer la méthode de rendu dans un basepage et dériver tout votre modèles de cela.

  2. Utilisez un httpmodule ou le global.asax et Joindre un Filtre à la réponse objet. Pour moi cela fait plus sens esthétique parce que le "filtre" la propriété est censée vous aider filtrer la sortie qui est exactement Ce que vous voulez!


1 commentaires

Merci d'avoir répondu. UP-vote pour effort! La chose de base n'est pas vraiment une solution différente, mais plus d'ajout à l'a accepté. Mais bonne idée. Je pense que c'est toujours une bonne idée de créer une classe de base de base que toute votre page dérive de. Ou peut-être 2-3 en fonction des types de pages que vous avez. En ce qui concerne le httpmodule et le filtre, c'est un grand! Encore une fois, semblable à la solution acceptée, mais la logique des remplacements serait extraite de la page. Ce serait génial si vous faites des remplaçants dans plus d'un endroit! Joli!