Firefox вызывает двойные PostBacks в моем приложении asp.net. IE и Safari не вызывают проблемы.
У меня есть форма для заполнения пользователями, которая находится во втором представлении, показанном в MultiView. MultiView находится внутри UpdatePanel, поэтому представления обновляются с помощью частичной обратной передачи страницы. Как только они представлены, они отправляют форму, и их записи сохраняются в БД.
Чтобы пользователи не могли дважды щелкнуть кнопку отправки, я использую Javascript для отключения кнопки после отправки формы. В Интернете есть несколько методов, которые показывают, как это сделать, и я использовал это конкретное решение довольно давно. Как я уже говорил, только Firefox вызывает двойной PostBack. Похоже, что это общая проблема, и если вы воспользуетесь Google, вы найдете ряд обсуждений, но я так и не нашел ответа. Большинство дискуссий вращаются вокруг атрибута src пустого существа. Я использую ImageButton, но атрибут src никогда не должен быть пустым в моем случае.
Давайте посмотрим на код.
Первая разметка (сокращенно):
<asp:UpdatePanel ID="UP1" runat="server">
<ContentTemplate>
<asp:MultiView id="MV1" runat="server" ActiveViewIndex="0">
<asp:View id="View1" runat="server">
Some markup and some asp.net controls
</asp:View>
<asp:View id="View2" runat="server">
<asp:TextBox ID="NameTB" runat="server" />
<asp:RequiredFieldValidator ID="NameTBRFV" runat="server"
ControlToValidate="NameTB" ErrorMessage="Required"
CssClass="validate" />
<asp:ImageButton ID="Submit" runat="server"
ImageUrl="Images/AlumniSubmitButton.jpg" OnClick="Submit_Click" />
</asp:View>
</asp:MultiView>
<ContentTemplate>
</asp:UpdatePanel>
Второй код загрузки страницы:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Utilities.BindSafeClick(Submit, "Images/AlumniSubmitButton.jpg");
}
}
В-третьих, код, который добавляет клик, который отключает кнопку:
public static void BindSafeClick(Control control, String waitMessage)
{
StringBuilder sbValid = new StringBuilder();
Page myPage = control.Page;
if (control is Button)
{
Button myControl = (Button)control;
sbValid.Append("if (typeof(Page_ClientValidate) == 'function') { ");
sbValid.Append("if (Page_ClientValidate() == false) { return false; }} ");
sbValid.Append("this.value = '" + waitMessage + "';");
sbValid.Append("this.disabled = true;");
sbValid.Append(myPage.ClientScript.GetPostBackEventReference(myControl, null));
sbValid.Append(";");
// the following depends on if submit control has UseSubmitBehavior set.
// Basically set the opposite here.
if (myControl.UseSubmitBehavior)
{
sbValid.Append("return false;");
}
else
{
sbValid.Append("return true;");
}
myControl.Attributes.Add("onclick", sbValid.ToString());
}
else if (control is LinkButton)
{
LinkButton myControl = (LinkButton)control;
sbValid.Append("if (typeof(Page_ClientValidate) == 'function') { ");
sbValid.Append("if (Page_ClientValidate() == false) { return false; }} ");
sbValid.Append("this.innerText = '" + waitMessage + "';");
sbValid.Append("this.disabled = \"disabled\";");
sbValid.Append(myPage.ClientScript.GetPostBackEventReference(myControl, null));
sbValid.Append(";");
myControl.Attributes.Add("onclick", sbValid.ToString());
}
else if (control is ImageButton)
{
ImageButton myControl = (ImageButton)control;
sbValid.Append("if (typeof(Page_ClientValidate) == 'function') { ");
sbValid.Append("if (Page_ClientValidate() == false) { return false; }} ");
sbValid.Append("this.src = '" + waitMessage + "';");
sbValid.Append("this.disabled = true;");
sbValid.Append(myPage.ClientScript.GetPostBackEventReference(myControl, null));
sbValid.Append(";");
myControl.Attributes.Add("onclick", sbValid.ToString());
}
}
Я посмотрел на отрендеренный вывод, когда браузер получил форму, и заметил, что javascript onclick, похоже, выполняет две обратной передачи.
Один и тот же код отображается в Safari и IE.
Почему Firefox будет единственным, кто делает два PostBacks?
Вот визуализированный вывод (добавлены разрывы строк и интервалы в onclick для удобства чтения)
<input type="image" name="Submit" id="Submit" src="Images/AlumniSubmitButton.jpg"
onclick="
if (typeof(Page_ClientValidate) == 'function')
{
if (Page_ClientValidate() == false)
{
return false;
}
}
this.src = 'Images/AlumniSubmitButton.jpg';
this.disabled = true;
__doPostBack('Submit','');
WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("Submit", "", true, "", "", false, false))" style="border-width:0px;" />