Обратная передача не работает со страницей aspx в качестве документа по умолчанию - PullRequest
39 голосов
/ 29 августа 2011

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

Есть ли способ заставить эту работу? Или я должен удалить документ по умолчанию и заставить пользователей перейти к 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...

Ответы [ 8 ]

47 голосов
/ 10 сентября 2011

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

Быстрый поиск обнаружил это, ASP.NET 4 Разрывные изменения (см., Что обработчики событий могут не вызываться в документе по умолчанию в IIS 7 или IIS7.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 action="" />

Это различие в способе отображения атрибута действия может привести к незначительным изменениям в обработке сообщения формы IIS иASP.NET.Если атрибутом действия является пустая строка, объект 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) Создание адаптера форм Forms

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>
14 голосов
/ 12 марта 2013

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

    public void Page_PreRender(object sender, EventArgs e)
    {
        if (string.IsNullOrEmpty(this.Page.Form.Action))
            this.Page.Form.Action = "Default.aspx";
    }
7 голосов
/ 04 сентября 2011

Если вы заинтересованы в добавлении дополнительного кода в файл 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);
    }
}
1 голос
/ 07 сентября 2011

Вы пытались настроить кнопку изображения для использования события Command вместо «Клик»?

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

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

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

0 голосов
/ 25 октября 2014

Рассмотрите возможность использования сопоставлений 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 с косой чертой и без нее.

Вы также можетесоздавать перенаправления из виртуальных папок, когда вам нужны быстрые изменения и вы не хотите изменять исходный код (как показано выше в примере с этой папкой).

0 голосов
/ 06 октября 2012

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

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

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

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

0 голосов
/ 21 мая 2012

Когда я обновил свой веб-проект с 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».)

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

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

Мне не нужно было делать никаких других вещей, предложенных другими респондентами.

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

0 голосов
/ 08 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...