确认后回传之前,禁用网络表单按钮(Disable Webform button after vali

2019-10-17 14:50发布

使用的WebForms,我怎么能有一个按钮,这是残疾人,被点击后,才,也验证后已经过去了?

我知道有: 禁用asp.net按钮点击之后,以防止双击

不过,也有我的网页上其他回传,最后按下按钮这证实了之前预订的,我需要这些就可以了。

这只是最后按下按钮,我需要确保通过了验证,但只允许一个压榨,被禁用了。

代码如下:

   protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        FinalButton.Attributes.Add("onclientclick", "if(Page_ClientValidate('vg')){this.disabled = true; }");
    }

}
protected void Button1_Click(object sender, EventArgs e)
{
    TextBox1.Text = "Hi";
}
protected void Button3_Click(object sender, EventArgs e)
{
    TextBox1.Text = "";
}

ASPX页面:

 <p>
    <asp:TextBox ID="TextBox1" runat="server" ValidationGroup="vg"></asp:TextBox>
</p>
<p>
    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Set TextBox1 to Hi" />
    <asp:Button ID="Button3" runat="server" OnClick="Button3_Click" Text="Set TextBox1 to Empty" />
</p>
<p>
    <asp:Button ID="FinalButton" runat="server" Text="Final Submit" ValidationGroup="vg" />
    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBox1" ErrorMessage="RequiredFieldValidator" ValidationGroup="vg"></asp:RequiredFieldValidator>
</p>

因此,除非将文本框填充,“FinalButton”不应该提交(这部分作品)。 然而,如果填充了文本框,那么它应该被禁用,以避免重复点击,回发前 - 但它并没有禁止,所以我在这里假设我的代码,是不正确的:

FinalButton.Attributes.Add("onclientclick", "if(Page_ClientValidate('vg')){this.disabled = true; }");

当它在网页上呈现的源,展示该按钮:

<input type="submit" name="ctl00$MainContent$FinalButton" value="Final Submit" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$MainContent$FinalButton&quot;, &quot;&quot;, true, &quot;vg&quot;, &quot;&quot;, false, false))" id="MainContent_FinalButton" onclientclick="if(Page_ClientValidate(&#39;vg&#39;)){this.disabled = true; }" />

谢谢,

标记

Answer 1:

您可以在渲染HTML按钮的单引号得到改变看&#39; ,这是一个ASP.NET安全功能。 上所以有些职位(如停止标签制造商逃逸单引号ASP.NET MVC 2 )已经发布了远来解决这个问题,但我个人不会采取这条路线。

注意,对于这两个例子中我添加了一个return false停止表单提交,所以你可以看到按钮实际上禁用。 删除此,当你准备好继续测试代码。

您可以只将代码放在按钮本身:

<asp:Button ID="FinalButton" runat="server" OnClientClick="if(Page_ClientValidate('vg')){this.disabled = true; return false; }" Text="Final Submit" ValidationGroup="vg" />

这工作,但看起来肮脏。 它的清洁剂不具有OnClientClick只是用javascript添加单击事件:

<script>
    $("#<%= FinalButton.ClientID %>").click(function () {
        if (Page_ClientValidate('vg')) {
            this.disabled = true; return false;
        }
    });
</script>

好了,所以,一旦你看到的工作,并删除return false; ,你仍然会有问题。 即一个禁用的按钮不执行在某些浏览器回发。 因此,一些浏览器会回传,就像它与其他代表一样将采取行动return false; 。 这不好。

更糟的是,无论哪种浏览器,ASP.NET是不会运行中被禁用按钮的click事件(如果加入类似OnClick="FinalButton_Click"的按钮)。 您可以在IE9测试了这一点,因为被禁用按钮仍然会后回来,但你可以看到你OnClick事件将不会触发。 在另一方面Chrome将只是禁用按钮,而不是回传。



Answer 2:

您可以使用setTimeout的把戏禁用回传被触发后右侧的按钮:

<script>
    $("#<%= FinalButton.ClientID %>").click(function ()
    {
        var self = this;
        setTimeout(function ()
        {
            self.disabled = true;
        }, 0);
    });
</script>


文章来源: Disable Webform button after validation and before postback