Подтвердить что ты не робот

Postback не работает с aspx-страницей как документ по умолчанию

Если я перейду к http://localhost/edumatic3/trunk/login/accesscode/Default.aspx, мой postback будет работать. Однако, если я перейду к http://localhost/edumatic3/trunk/login/accesscode/ (с Default.aspx, определяемым как документ по умолчанию), мой postback не работает.

Есть ли способ сделать эту работу? Или я должен удалить документ по умолчанию и заставить пользователей просматривать http://localhost/edumatic3/trunk/login/accesscode/Default.aspx?

UPDATE:

Код (часть):

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

Код за (часть):

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

Когда я нажимаю на ImageButton, запускается Page_Load, а IsPostBack - false... Обычно это должно быть правдой. ContinueImageButton_Click (...) не запускается вообще.

В HTML (часть):

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

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

Ответ 1

Я думал, что попытаюсь воспроизвести это, и ты абсолютно прав. Он разбивается без default.aspx с помощью очень простого примера, который вы предоставили. Глядя на HTML, причина довольно ясна. Это потому, что атрибут действия пуст.

Быстрый поиск угадал это, ASP.NET 4 Breaking Changes (см. Обработчики событий не могут быть подняты в документе по умолчанию в IIS 7 или Интегрированный режим IIS 7.5).

Теперь ASP.NET 4 отображает значение атрибута элемента формы HTML как пустую строку, когда запрос делается на URL без продолжения, который имеет документ по умолчанию, сопоставленный с ним. Например, в более ранних версиях ASP.NET, запрос http://contoso.com приведет к запросу к Default.aspx. В этом документе тег открытия формы будет как показано в следующем примере:

<form action="Default.aspx" />

В ASP.NET 4 запрос http://contoso.com также приводит к запрос к Default.aspx. Тем не менее, ASP.NET теперь делает открытие HTML form, как в следующем примере:

<form action="" />

Эта разница в том, как визуализируется атрибут действия, может вызвать тонкие изменения в том, как сообщение формы обрабатывается IIS и ASP.NET. Когда атрибут action является пустой строкой, IIS Объект DefaultDocumentModule создаст дочерний запрос для Default.aspx. В большинстве случаев этот дочерний запрос является прозрачным к коду приложения, а страница Default.aspx работает нормально.

Однако потенциальное взаимодействие между управляемым кодом и IIS 7 или IIS 7.5 Интегрированный режим может привести к тому, что управляемые страницы .aspx перестанут работать правильно во время запроса на ребенка.

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

1) Добавьте этот код в 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) Создайте Адаптер управления формами

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

Зарегистрируйте его, создав этот файл в App_Browsers\Default.browsers

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

Ответ 2

Еще одна опция - проверить, является ли действие формы пустым непосредственно перед отображением страницы. Это сработало для меня:

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

Ответ 3

Если вы заинтересованы в добавлении дополнительного кода в файл default.aspx, вы можете использовать аналогичный подход, указанный в сообщении в блоге здесь; Речь идет о перенаправлении пользователя на ту же страницу по умолчанию, но с явным именем страницы....

//код, скопированный из упомянутого блога

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

Ответ 4

Вы пытались настроить кнопку изображения для использования события Command, а не 'Click'?

Я думаю, что "возможно", возможно, что щелчок изображения не приведет к полной обратной передаче, возможно, попробуйте определить вещи, как показано ниже:

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

Затем определите свою кнопку следующим образом:

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

Кажется, я помню, что мне нужно было сделать это, чтобы кнопка изображения могла "отправить" форму, поэтому я предполагаю, что это приведет к последующей обратной передаче.

Ответ 5

У меня была аналогичная проблема. Проблема заключалась в том, что в IIS документ по умолчанию был настроен как default.aspx, но имя моей страницы было Default.aspx. Это всего лишь вопрос чувствительности к регистру.

Ответ 6

Когда я обновил свой веб-проект от VS 2005 (.Net 2.5) до VS2010 (.Net 4.0), VS2010 был вставлен в мой web.config:

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

Когда я перешел на "http://myserver/mywebsite", который я раньше мог делать под .Net 2.5, я получил

"Ошибка HTTP 500.19 - Внутренняя ошибка сервера" Запрошенная страница не может быть доступна, потому что связанные данные конфигурации для страницы недействительны ". (Он отобразил" defaultDocument" node.)

Однако мне удалось решить проблему очень просто в web.config, просто вставив "/" в начало значения веб-страницы по умолчанию, как показано ниже:

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

Мне не нужно было делать какие-либо другие предложения, предложенные другими респондентами.

Есть ли какие-либо непреднамеренные последствия или gotchas от этого?

Ответ 7

Если ваше процессорное средство формы не находится в корне, вы можете использовать абсолютный путь без использования имени файла.

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

Протестировано в .NET 2.0

Проблема произошла с пустым полем действия, но корректно работала с вводом пути.

Ответ 8

Рассмотрим использование сопоставлений URL-адресов, выполненных через ваш web.config. Таким образом, вы можете избежать лишнего кода в своем приложении и позволить IIS работать для вас.

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

Не забудьте включить обе версии этого URL-адреса с и без окончания косой черты.

Вы также можете создавать перенаправления из виртуальных папок, когда вам нужны быстрые изменения, и не хотите изменять исходный код (как показано выше с примером "this-folder-does-not-exist" ).