it-swarm.com.de

Postback funktioniert nicht mit der aspx-Seite als Standarddokument

Wenn ich zu http: //localhost/edumatic3/trunk/login/accesscode/Default.aspx browse, funktioniert mein Postback. Wenn ich jedoch zu http: // localhost/edumatic3/trunk/login/accesscode/ navigiere (wobei Default.aspx als Standarddokument definiert ist), funktioniert mein Postback nicht.

Gibt es eine Möglichkeit, dies zu erreichen? Oder sollte ich das Standarddokument entfernen und Benutzer dazu zwingen, zu http: //localhost/edumatic3/trunk/login/accesscode/default.aspx zu navigieren?

AKTUALISIEREN:

Code (Teil):

<div id="continueDiv">
        <asp:ImageButton ID="continueImageButton" 
                runat="server" ValidationGroup="continue" 
                OnClick="ContinueImageButton_Click" 
                AlternateText="<%$ Resources:login, continue_alternatetext %>"/>
    </div>

Code hinter (Teil):

protected void Page_Load(object sender, EventArgs e)
{
    Log.Debug("Page_Load(...)");
    Log.Debug("Page_Load(...) :: PostBack = " + IsPostBack);

    if (!IsPostBack)
    {
        continueImageButton.ImageUrl = "~/App_Themes/" + base.Theme 
        + "/images/" + Resources.login.btn_continue;
    }
}

/// <summary>
/// Continue Image Button Click Handler
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void ContinueImageButton_Click(object sender, EventArgs e)
{
 ....

Wenn ich auf den ImageButton klicke, wird PageLoad ausgelöst und IsPostBack ist false ... Normalerweise sollte dies wahr sein. ContinueImageButton_Click (...) wird überhaupt nicht ausgelöst.

In HTML (Teil):

<input type="image" name="ctl00$ContentPlaceHolder1$continueImageButton" 
id="ctl00_ContentPlaceHolder1_continueImageButton" 
src="../../App_Themes/LoginTedu/images/en_continue.png" alt="Continue" 
onclick="javascript:WebForm_DoPostBackWithOptions(new 
WebForm_PostBackOptions(&quot;ctl00$ContentPlaceHolder1$continueImageButton&quot;, 
&quot;&quot;, true, &quot;continue&quot;, &quot;&quot;, false, false))" 
style="border-width:0px;">

HTTP-Anfrage:

POST /edumatic3/trunk/login/accesscode/ HTTP/1.1
Host: localhost
Referer: http://localhost/edumatic3/trunk/login/accesscode/
Content-Length: 1351
Cache-Control: max-age=0
Origin: http://localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 
   (KHTML, like Gecko)                 Chrome/13.0.782.215 Safari/535.1
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: nl,en-US;q=0.8,en;q=0.6,fr;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
ASP.NET_SessionId=33yal3buv310y2etuj33qghg; CurrenUICulture=en-us

__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=%2FwEPDw...
39
Lieven Cardoen

Ich dachte, ich würde versuchen, dies zu reproduzieren, und du hast absolut recht. Es bricht ohne den default.aspx mit einem sehr einfachen Beispiel ab, das Sie angegeben haben. Wenn man sich das HTML ansieht, ist der Grund ziemlich klar. Dies liegt daran, dass das Aktionsattribut leer ist.

Eine schnelle Suche hat dies bestätigt, ASP.NET 4 Breaking Changes (Siehe Eventhandler in einem Standarddokument in IIS 7 oder IIS 7.5 Integrierter Modus) nicht.

ASP.NET 4 stellt jetzt den Aktionsattributwert des HTML-Formularelements dar als leere Zeichenfolge, wenn eine Anforderung an eine erweiterungslose URL gestellt wird, die hat ein Standarddokument zugeordnet. Zum Beispiel in früheren Versionen von ASP.NET würde eine Anfrage an http://contoso.com zu einer Anfrage führen zu Default.aspx. In diesem Dokument lautet das öffnende Formular-Tag wie im folgenden Beispiel dargestellt:

<form action="Default.aspx" />

In ASP.NET 4 führt eine Anforderung an http://contoso.com ebenfalls zu einer Anforderung an Default.aspx. ASP.NET rendert jetzt jedoch die HTML-Öffnung Formular-Tag wie im folgenden Beispiel:

<form action="" />

Dieser Unterschied in der Darstellung des Aktionsattributs kann .__ verursachen. subtile Änderungen in der Verarbeitung eines Formularpostens durch IIS und ASP.NET . Wenn das Aktionsattribut eine leere Zeichenfolge ist, wird der IIS Das DefaultDocumentModule-Objekt erstellt eine untergeordnete Anforderung an Default.aspx. In den meisten Fällen ist diese untergeordnete Anforderung transparent auf Anwendungscode und die Default.aspx-Seite wird normal ausgeführt.

Eine mögliche Interaktion zwischen verwaltetem Code und IIS 7 oder IIS 7.5 Der integrierte Modus kann dazu führen, dass verwaltete ASPX-Seiten nicht mehr funktionieren richtig während der Kinderanfrage.

Ich habe diese beiden Korrekturen erstellt, die das Problem beheben. Verwenden Sie entweder.

1) Fügen Sie diesen Code zu Global.asax hinzu

void Application_BeginRequest(object sender, EventArgs e)
{
    var app = (HttpApplication)sender;
    if (app.Context.Request.Url.LocalPath.EndsWith("/"))
    {
    app.Context.RewritePath(
             string.Concat(app.Context.Request.Url.LocalPath, "default.aspx"));
    }
}

2) Erstellen Sie einen Forms ControlAdapter

public class FormControlAdapter : ControlAdapter
{
    protected override void Render(System.Web.UI.HtmlTextWriter writer)
    {
        base.Render(new RewriteFormHtmlTextWriter(writer));
    }

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

        public override void WriteAttribute(string name, string value,
                                            bool fEncode)
        {
            if (name.Equals("action") && string.IsNullOrEmpty(value))
            {
                value = "default.aspx";
            }
            base.WriteAttribute(name, value, fEncode);
        }
    }
}

Registrieren Sie es, indem Sie diese Datei in App_Browsers\Default.browsers erstellen

<browsers>
    <browser refID="Default">
       <controlAdapters>
          <adapter controlType="System.Web.UI.HtmlControls.HtmlForm"
                            adapterType="TheCodeKing.Web.FormControlAdapter" />
       </controlAdapters>
    </browser>
</browsers>
46
TheCodeKing

Eine andere Option besteht darin, vor dem Rendern der Seite zu prüfen, ob die Formularaktion leer ist. Das hat für mich funktioniert:

    public void Page_PreRender(object sender, EventArgs e)
    {
        if (string.IsNullOrEmpty(this.Page.Form.Action))
            this.Page.Form.Action = "Default.aspx";
    }
14
Eric

Wenn Sie daran interessiert sind, zusätzlichen Code in Ihre default.aspx-Datei einzufügen, können Sie den in Blogpost hier - definierten Ansatz verwenden. Dabei geht es darum, den Benutzer auf dieselbe Standardseite umzuleiten, jedoch mit einem expliziten Seitennamen ....

// Code, kopiert aus dem genannten Blog

protected void Page_Load(object sender, EventArgs e)
{        
    string defaultPage = "default.aspx";
    string rawUrl = Request.RawUrl; //get current url

    //if current url doesn't contains default page name then add
    //default page name, and append query string as it is, if any
    if (rawUrl.ToLower().IndexOf(defaultPage) < 0)
    {
        string newUrl;
        if (rawUrl.IndexOf("?") >= 0)
        {
            // URL contains query string
            string[] urlParts = rawUrl.Split("?".ToCharArray(), 2);

            newUrl = urlParts[0] + defaultPage + "?" + urlParts[1];
        }
        else
        {
            newUrl = (rawUrl.EndsWith("/")) ? rawUrl + defaultPage : rawUrl + "/" + defaultPage;
        }

        Response.Redirect(newUrl);
    }
}
7
Waqas

Haben Sie versucht, Ihre Bildschaltfläche so einzustellen, dass sie das Befehlsereignis anstelle von "Klicken" verwendet? 

Ich denke, es könnte 'möglich' sein, dass ein Klick auf ein Bild kein vollständiges Postback verursacht. Versuchen Sie, die folgenden Dinge zu definieren:

  void ImageButton_Command(object sender, CommandEventArgs e) 
  {
     if (e.CommandName == "YourCommandName")
        //do your action
  }

Dann definieren Sie Ihren Button so:

      <asp:ImageButton id="btn1" runat="server"
       ImageUrl="images/image.jpg"
       OnCommand="ImageButton_Command"
       CommandName="YourCommandName"/>

Ich scheine mich zu erinnern, dass ich dies tun musste, damit eine Bildschaltfläche ein Formular "einreichen" konnte. Ich gehe also davon aus, dass dies das Postback verursacht, das Sie suchen.

1
dougajmcdonald

Erwägen Sie die Verwendung von URL-Zuordnungen, die über Ihre web.config vorgenommen werden. Auf diese Weise können Sie zusätzlichen Code in Ihrer App vermeiden und IIS für Sie arbeiten lassen.

<system.web>
    <urlMappings>
        <add url="~/login" mappedUrl="~/login/default.aspx" />
        <add url="~/login/" mappedUrl="~/login/default.aspx" />
        <add url="~/this-folder-does-not-exist" mappedUrl="~/login/default.aspx" />
        <add url="~/this-folder-does-not-exist/" mappedUrl="~/login/default.aspx" />
    </urlMappings>
</system.web>

Vergewissern Sie sich, dass beide Versionen dieser URL mit und ohne Endstrich eingeschlossen sind.

Sie können auch Umleitungen aus virtuellen Ordnern erstellen, wenn Sie schnelle Änderungen benötigen und den Quellcode nicht ändern möchten (wie oben im Beispiel 'this-ordner nicht vorhanden' gezeigt).

0
OrizG

Ich hatte einmal ein ähnliches Problem. Das Problem war, dass das Standarddokument in IIS als default.aspx konfiguriert war, der Name meiner Seite jedoch Default.aspx war. Es war nur eine Frage der Empfindlichkeit.

0
slfan

Als ich mein Webprojekt von VS 2005 (.Net 2.5) auf VS2010 (.Net 4.0) aufgerüstet habe, wurde von VS2010 Folgendes in meine web.config eingefügt:

<system.webServer>
  <defaultDocument>
        <files>
          <add value="mydefaultpage.aspx" />
        </files>
    </defaultDocument>
</system.webServer>

Als ich zu "http: // myserver/mywebsite" navigierte, was ich früher unter .NET 2.5 tun konnte, bekam ich es 

"HTTP-Fehler 500.19 - Interner Serverfehler " Auf die angeforderte Seite kann nicht zugegriffen werden, da die zugehörigen Konfigurationsdaten für die Seite ungültig sind. "(Der Knoten" defaultDocument "wurde angezeigt.)

Ich konnte das Problem jedoch sehr einfach in web.config beheben, indem "/" am Anfang des Standardwerts für die Webseite eingefügt wurde (siehe unten):

<system.webServer>
  <defaultDocument>
        <files>
          <add value="/mydefaultpage.aspx" />
        </files>
    </defaultDocument>
</system.webServer>

Ich musste nichts anderes tun, als von den anderen Befragten vorgeschlagen.

Gibt es unbeabsichtigte Konsequenzen oder Krisen, wenn Sie dies auf diese Weise tun?

0
Hoyacoder

Wenn sich Ihre Formularprozessoraktion nicht im Stammverzeichnis befindet, sollten Sie in der Lage sein, einen absoluten Pfad zu verwenden, ohne den Dateinamen zu verwenden.

<form action='/form/processor/' method=post id='myform'>

In .NET 2.0 getestet

Das Problem trat mit einem leeren Aktionspfad auf, funktionierte jedoch ordnungsgemäß mit dem Pfadeintrag.

0
vividsoup