40 votes

Publication automatique ne fonctionne pas avec la page aspx comme Document par Défaut

Si je parcourir pour http://localhost/edumatic3/trunk/login/accesscode/Default.aspxmon publication des œuvres. Cependant, si je parcourir pour http://localhost/edumatic3/trunk/login/accesscode/ (avec par Défaut.aspx défini comme document par défaut), ma publication ne fonctionne pas.

Est-il un moyen de faire ce travail? Ou devrais-je supprimer le document par défaut et de forcer les utilisateurs à parcourir pour http://localhost/edumatic3/trunk/login/accesscode/default.aspx?

Mise à JOUR:

Code (partie):

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

Code derrière (une partie):

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)
{
 ....

Quand je clique sur le ImageButton, Page_Load est déclenchée, et IsPostBack est faux... Normalement, il doit être vrai. ContinueImageButton_Click(...) n'est pas déclenché à tous.

En HTML (partie):

<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;">

Demande Http:

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...

51voto

TheCodeKing Points 11632

Je pensais que je voudrais essayer de reproduire cela, et vous avez absolument raison. Il se casse sans l' default.aspx avec un exemple très simple que vous avez fournis. En regardant le code HTML, la raison est assez clair. C'est parce que l'attribut action est vide.

Une recherche rapide se délectait de cette, ASP.NET 4 dernières Modifications (voir Gestionnaires d'Événement Peut ne Pas Être Pas Soulevées dans le Document par Défaut dans IIS 7 ou IIS 7.5 Mode Intégré).

ASP.NET 4 rend maintenant l'élément de formulaire HTML d'action de la valeur de l'attribut comme une chaîne vide quand une demande est faite pour un extensionless URL a défaut d'un document associé à. Par exemple, dans les versions antérieures de ASP.NET une demande de http://contoso.com le résultat serait une demande la valeur par Défaut.aspx. Dans ce document, le formulaire d'ouverture de la balise serait rendu comme dans l'exemple suivant:

<form action="Default.aspx" />

Dans ASP.NET 4, une demande de http://contoso.com aussi les résultats dans un demande de Défaut.aspx. Cependant, ASP.NET aujourd'hui rend le code HTML d'ouverture balise de formulaire, comme dans l'exemple suivant:

<form action="" />

Cette différence dans la façon dont l'attribut action est rendue peut causer des changements subtils dans le comportement d'un post de formulaire sont traitées par les services IIS et ASP.NET. Lorsque l'action de l'attribut est une chaîne vide, l'IIS DefaultDocumentModule objet de créer un enfant demande à Par défaut.aspx. Dans la plupart des conditions, cet enfant demande est transparent le code de l'application, et la valeur par Défaut.page aspx fonctionne normalement.

Cependant, une interaction potentielle entre le code managé et IIS 7 ou IIS 7.5 mode Intégré peut provoquer des gérer .des pages aspx arrêt de travail correctement pendant que l'enfant demande.

J'ai créé ces deux correctifs de résoudre le problème, utilisez l'un ou l'autre.

1) Ajouter ce code Global.asax

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) Créer des Formulaires 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);
        }
    }
}

Enregistrer par la création de ce fichier dans App_Browsers\par Défaut.les navigateurs

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

16voto

Eric Points 91

Une autre option est de vérifier si l'action du formulaire est vide à droite avant le rendu de la page. Cela a fonctionné pour moi:

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

7voto

Waqas Points 4802

Si vous êtes intéressé à ajouter du code supplémentaire dans votre défaut.aspx le fichier, puis vous pouvez utiliser la même approche définie dans blog ici; ce Qui est sur la redirection de l'utilisateur vers la même page par défaut, mais avec explicite du nom de la page....

//code copié à partir mentionné 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);
    }
}

1voto

dougajmcdonald Points 6231

Avez-vous essayé de la définition de votre image bouton pour utiliser la Commande de l'événement plutôt que de "Clic"?

Je pense qu'il "pouvait" être possible qu'une image, cliquez sur ne pas provoquer une publication complète, essayez peut-être de définir les choses comme ci-dessous:

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

Définissez ensuite votre bouton comme ceci:

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

Il me semble me rappeler avoir besoin de faire cela pour permettre à une image le bouton 'submit' un formulaire, donc je suppose que cela va provoquer la publication que vous êtes après.

0voto

slfan Points 4541

Une fois, j'ai eu un problème similaire. Le problème est que dans IIS le document par défaut est configuré en tant que par défaut.aspx, mais le nom de ma page par Défaut.aspx. C'était juste une question de sensibilité à la casse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X