ASP.NET Несколько событий Page_Load с перезаписью URL - PullRequest
0 голосов
/ 18 февраля 2010

Я использую urlrewriter Intelligencia в качестве модуля перезаписи URL. У меня есть одна очень странная проблема, которая возникает только тогда, когда URL переписан, но для того, чтобы сделать его более увлекательным, не на всех переписанных страницах.

Изменить: Забыл сказать вам, в чем проблема Боинг Боинг . проблема в том, что мое событие Page_Load запускается 2 раза.

Вот так выглядит мой адаптер для перезаписи формы:

using System;

с использованием System.Web.UI; использование System.Web; использование System.Web.UI.WebControls;

открытый класс FormRewriterControlAdapter: System.Web.UI.Adapters.ControlAdapter {

protected override void Render(System.Web.UI.HtmlTextWriter writer)
{

    base.Render(new RewriteFormHtmlTextWriter(writer));

}

}

открытый класс RewriteFormHtmlTextWriter: HtmlTextWriter {

public RewriteFormHtmlTextWriter(HtmlTextWriter writer)
    : base(writer)
{
    this.InnerWriter = writer.InnerWriter;
}

public RewriteFormHtmlTextWriter(System.IO.TextWriter writer)
    : base(writer)
{
    base.InnerWriter = writer;
}

public override void WriteAttribute(string name, string value, bool fEncode)
{

    // If the attribute we are writing is the "action" attribute, and we are not on a sub-control, 
    // then replace the value to write with the raw URL of the request - which ensures that we'll 
    // preserve the PathInfo value on postback scenarios 

    if ((name == "action"))
    {

        HttpContext Context = default(HttpContext);
        Context = HttpContext.Current;

        if (Context.Items["ActionAlreadyWritten"] == null)
        {

            // Because we are using the UrlRewriting.net HttpModule, we will use the 
            // Request.RawUrl property within ASP.NET to retrieve the origional URL 
            // before it was re-written. You'll want to change the line of code below 
            // if you use a different URL rewriting implementation. 

            value = Context.Request.RawUrl;

            // Indicate that we've already rewritten the <form>'s action attribute to prevent 
            // us from rewriting a sub-control under the <form> control 

            Context.Items["ActionAlreadyWritten"] = true;
        }

    }


    base.WriteAttribute(name, value, fEncode);

}
* *} Тысяча двадцать-один

А вот так выглядит мой web.config

        <!-- Here the double page_load occurs  --> 
    <rewrite url="~/car-parts/(\d+)/(.+)" to="~/Products.aspx?type=parts&amp;iid=$1&amp;cid=9" />
    <rewrite url="~/car-stereo/(\d+)/(.+)" to="~/Products.aspx?type=stereo&amp;iid=$1&amp;cid=10" />



    <!-- this is working correctly -->
     <rewrite url="~/car-parts/browse-by-type/(\d+)/(.+)/(\d+)/(\d+)" to="~/Browse.aspx?cid=9&amp;type=country&amp;countryid=$1&amp;p=$3&amp;filter=$4" />

Я понятия не имею, где искать, я проверил свою HTML-разметку, так как я прочитал, что может решить эту проблему.

С уважением, Mark

Ответы [ 3 ]

1 голос
/ 05 марта 2013

когда я использую это правило перезаписи в моих правилах, эта проблема была решена:

<rewrite url="^(/.+(\.gif|\.flv|\.swf|\.png|\.jpg|\.ico|\.pdf|\.doc|\.xls|\.css|\.zip|\.rar|\.js|\.xml|\.mp3)(\?.+)?)$" to="$1" processing="stop" />

но не забывайте использовать это правило после всех ваших .css / .js / .jpg / ... правил.

0 голосов
/ 03 сентября 2010

Я нашел этот пост в поиске нескольких page_loads, но у меня возникла проблема с использованием динамически создаваемой CollapsePanel с использованием динамически создаваемого изображения.Заполнив ImageUrl изображением по умолчанию, проблема была решена.

header.Controls.Add( new Image
{
    ID = string.Format( "headerImage_{0}",  panelId ),
    EnableViewState = false,
    ImageUrl = "~/Images/collapse.jpg"
} );
0 голосов
/ 18 февраля 2010

Наконец-то я обнаружил, что это не имело никакого отношения к модулю перезаписи, это и вызвало проблему:

В одном из моих пользовательских контроллеров я использовал updateprogress

    <asp:UpdateProgress runat="server" AssociatedUpdatePanelID="upNewsletter" DisplayAfter="0">
    <ProgressTemplate>
        <asp:Image runat="server" ID="imgLoading" ImageUrl="~/Images/Template/loading.gif" />
    </ProgressTemplate>
</asp:UpdateProgress>

Теперь проблема в теге asp: Image. Я заменил его обычным тегом img, и теперь все снова работает нормально. Мне понадобилось время, чтобы понять это, и я надеюсь, что смогу избавить вас от головной боли.

С уважением

...