La devolución de datos no funciona con la página aspx como documento predeterminado

Si busco http: //localhost/edumatic3/trunk/login/accesscode/Default.aspx , mi postback funciona. Sin embargo, si navego a http: // localhost / edumatic3 / trunk / login / accesscode / (con Default.aspx definido como documento predeterminado), mi devolución de datos no funciona.

¿Hay alguna manera de hacer que esto funcione? ¿O debería eliminar el documento predeterminado y obligar a los usuarios a navegar a http: //localhost/edumatic3/trunk/login/accesscode/default.aspx ?

ACTUALIZAR:

Código (parte):

<asp:ImageButton ID="continueImageButton" runat="server" ValidationGroup="continue" OnClick="ContinueImageButton_Click" AlternateText=""/>

Código detrás (parte):

 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; } } ///  /// Continue Image Button Click Handler ///  ///  ///  protected void ContinueImageButton_Click(object sender, EventArgs e) { .... 

Cuando hago clic en ImageButton, se activa Page_Load, y IsPostBack es falso … Normalmente, debería ser cierto. ContinueImageButton_Click (…) no se activa en absoluto.

En HTML (parte):

  

Petición de 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... 

Pensé que trataría de reproducir esto, y tienes toda la razón. Se rompe sin default.aspx con un ejemplo muy simple que usted proporcionó. Al mirar el HTML, el motivo es bastante claro. Es porque el atributo de acción está vacío.

Una búsqueda rápida reveló esto, ASP.NET 4 Breaking Changes (vea Controladores de eventos no se pueden generar en un documento predeterminado en IIS 7 o modo integrado de IIS 7.5).

ASP.NET 4 ahora representa el valor de atributo de acción del elemento de formulario HTML como una cadena vacía cuando se realiza una solicitud a una URL sin extensión que tiene un documento predeterminado asignado a ella. Por ejemplo, en versiones anteriores de ASP.NET, una solicitud a http://contoso.com daría como resultado una solicitud a Default.aspx. En ese documento, la etiqueta de formulario de apertura se representaría como en el siguiente ejemplo:

 

En ASP.NET 4, una solicitud a http://contoso.com también da como resultado una solicitud a Default.aspx. Sin embargo, ASP.NET ahora muestra la etiqueta de formulario de apertura HTML como en el siguiente ejemplo:

 

Esta diferencia en cómo se representa el atributo de acción puede provocar cambios sutiles en la forma en que IIS y ASP.NET procesan una publicación de formulario. Cuando el atributo de acción es una cadena vacía, el objeto IIS DefaultDocumentModule creará una solicitud secundaria en Default.aspx. En la mayoría de las condiciones, esta solicitud secundaria es transparente para el código de la aplicación y la página Default.aspx se ejecuta normalmente.

Sin embargo, una interacción potencial entre el código administrado y el modo integrado IIS 7 o IIS 7.5 puede hacer que las páginas .aspx administradas dejen de funcionar correctamente durante la solicitud secundaria.

Creé estas dos correcciones que resuelven el problema, use cualquiera de ellas.

1) Agregue este código a 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) Crear un Adaptador de control de formularios

 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); } } } 

Regístrese creando este archivo en App_Browsers \ Default.browsers

        

Otra opción es verificar si la acción de formulario está vacía justo antes de representar la página. Esto funcionó para mí:

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

Si está interesado en agregar algún código adicional en su archivo default.aspx, puede usar el enfoque similar definido en la publicación del blog aquí ; Que se trata de redirigir al usuario a la misma página predeterminada pero con el nombre de página explícito ….

// código, copiado del blog mencionado

 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); } } 

¿Has intentado configurar tu botón de imagen para usar el evento Command en lugar de ‘Click’?

Creo que ‘podría’ ser posible que un clic en la imagen no provoque una devolución de datos completa, tal vez intente definir cosas de la siguiente manera:

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

Luego defina su botón de esta manera:

   

Me parece recordar que necesito hacer esto para permitir que un botón de imagen ‘envíe’ un formulario, así que supongo que esto causará la devolución de datos que está buscando.

Una vez tuve un problema similar. El problema era que en IIS el documento predeterminado se configuraba como default.aspx, pero el nombre de mi página era Default.aspx. Era solo una cuestión de sensibilidad de caso.

Cuando actualicé mi proyecto web de VS 2005 (.Net 2.5) a VS2010 (.Net 4.0), VS2010 insertó lo siguiente en mi web.config:

        

Cuando navegué a “http: // myserver / mywebsite”, que anteriormente era capaz de hacer en .Net 2.5, obtuve

“HTTP Error 500.19 – Error interno del servidor” No se puede acceder a la página solicitada porque los datos de configuración relacionados para la página no son válidos. “(Mostró el nodo” defaultDocument “).

Sin embargo, pude solucionar el problema muy simplemente en web.config simplemente insertando “/” al principio del valor predeterminado de la página web, como se muestra a continuación:

        

No tuve que hacer ninguna de las otras cosas sugeridas por los otros encuestados.

¿Hay alguna consecuencia involuntaria o trampa de hacerlo de esta manera?

Si la acción del procesador de formularios no está en la raíz, debería poder usar una ruta absoluta sin usar el nombre del archivo.

 

Probado en .NET 2.0

El problema ocurrió con la ruta de acción en blanco, pero funcionó correctamente con la entrada de ruta.

Considere el uso de asignaciones de URL a través de su web.config. De esta forma, puede evitar códigos adicionales en su aplicación y dejar que IIS trabaje para usted.

         

Asegúrese de incluir ambas versiones de esa URL con y sin barra final.

También puede crear redirecciones desde carpetas virtuales cuando necesite cambios rápidos y no desee modificar el código fuente (como se muestra arriba con el ejemplo ‘this-folder-does-not-exists’).