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("ctl00$ContentPlaceHolder1$continueImageButton",
"", true, "continue", "", 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...
Ответы
Ответ 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" ).