ASP.NET中的JQUERY .show()和div标记

时间:2011-04-02 18:43:55

标签: jquery asp.net

基本上,当页面加载时,我将div可见性设置为false。当我单击按钮时,我希望调用函数后面的函数,并且div标签是可见的,为真。

    $('#Button2').click(function () {
        $('#edit').show(function () {

        });
    });


    <input type="submit" id="Button2" runat="server" value="Search" OnServerClick="Button1_Click" />

但是当点击按钮时,页面会回发,导致div标签始终不可见。

我可以将return false设置为按钮的onlclick事件,但我也需要调用该函数。

3 个答案:

答案 0 :(得分:1)

如果您不希望表单提交,则阻止该事件的默认操作应该起作用:

$('#Button2').click(function ( evt )
{
    $('#edit').show(function ()
    {

    } );

    evt.preventDefault();
} );


<input type="submit" id="Button2" runat="server" value="Search" OnServerClick="Button1_Click" />

如果您 希望表单提交,那么您将不得不在服务器上弄清楚div应该或不应该在页面加载时显示(根据您的表单标准)提交/确认/等)。 jQuery只能在特定页面加载期间在页面内执行。

答案 1 :(得分:1)

答案 2 :(得分:0)

看起来你得到了答案,但这里有一些可能会有所帮助,尽管你的问题对你的意图有点模糊。


更新以包含UpdatePanel和jQuery解决方案

这是使用模板的jQuery解决方案,尽管您可以通过几种不同的方式执行此操作。您不需要使用模板,但我可能是最简单的方法。通过仅发送回JSON,开销比UpdatePanel解决方案小得多。

<script src="https://github.com/jquery/jquery-tmpl/raw/master/jquery.tmpl.min.js" type="text/javascript"></script>

<script id="productTemplate" type="text/html">
    <tr>
        <td>${Name}</td><td>${Price}</td> 
    </tr>
</script>

<script type="text/javascript">

    $(function () {

        $("#searching").ajaxStart(function () {
            $(this).show();
        });

        $("#searching").ajaxStop(function () {
            $(this).hide();
        });

        $("#btnSearch").click(function (evt) {

            // JSON.stringify requires json2.js for all browser support
            //https://github.com/douglascrockford/JSON-js

            //post to WebMethod
            var p = { product: $("#product").val() };
            $.ajax({
                type: "POST",
                url: "Default.aspx/Search",
                data: JSON.stringify(p),
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (data) {
                   //unwrap response if using .NET 3.5+ 
                   var results = data.d;

                   //jQuery templates make it much easier to render repeat data
                    $("#productTemplate").tmpl(results).appendTo($("#products").empty());
                    $("#results").show('slow');
                }
            });

            evt.preventDefault();
        });

</script>

HTML

<div id="searching" style="display:none;">
    Searching Please Wait....
    <img src="Products/ajax-loader.gif" alt="Searching" />
</div>
<input type="text" id="product" />
<input type="submit" id="btnSearch" value="Search" />

<div id="results" style="display:none;">
    <table cellspacing="0" border="1" style="border-collapse:collapse;">
        <tbody><tr><th scope="col">Product</th><th scope="col">Price</th></tr></tbody>
        <tbody id="products"></tbody>
    </table>
</div>

代码隐藏 - 您需要使用System.Web.Services;

//If you're going to be using this in multiple locations then I'd put this into a seperate WebService.asmx
[WebMethod]
public static List<Product> Search(string product)
{

    //Simulate database call
    System.Threading.Thread.Sleep(2000);

    //Do your database code here

    //Using strongly typed model makes generating the JSON much easier
    var products = new List<Product>();

    for (int i = 0; i < 10; i++) {
        products.Add(new Product() { Name = String.Format("Product {0} {1}", product, i), Price = 10 * i });
    }

    return products;
}

public class Product
{
    public string Name { get; set; }
    public int Price { get; set; }
}

更新面板解决方案可能对普通的ASP.NET更为熟悉,但它的缺点是只隐藏了回发周期。您仍在每个请求上发回完整的ViewState和HTMl。

<asp:ScriptManager ID="ScriptManager" runat="server"></asp:ScriptManager>

<!-- Grab a nice loading gif http://www.ajaxload.info/ -->
<asp:UpdateProgress ID="MainUpdateProgress" runat="server" 
    AssociatedUpdatePanelID="MainUpdatePanel">
    <ProgressTemplate>
        Searching Please Wait....
        <img src="ajax-loader.gif" alt="Searching"/>
    </ProgressTemplate>
</asp:UpdateProgress>

<asp:UpdatePanel ID="MainUpdatePanel" runat="server">

<ContentTemplate>
<asp:TextBox id="tbProduct" runat="server" />
<asp:Button ID="btnSearch" runat="server" Text="Search Products" 
        onclick="btnSearch_Click" />


<asp:GridView ID="grdvProducts" runat="server"></asp:GridView>

<br />

<!-- if you dont want to use a gridview then a repeater will do -->
<asp:Repeater ID="rProducts"  runat="server">
    <HeaderTemplate>
        <table cellspacing="0" border="1" style="border-collapse:collapse;">
        <tbody>
        <tr><th scope="col">Product</th><th scope="col">Price</th></tr>
    </HeaderTemplate>
    <ItemTemplate>
        <tr><td><%# Eval("Product") %></td><td><%# Eval("Price") %></td></tr>
    </ItemTemplate>
    <FooterTemplate>
        </tbody>
        </table>
    </FooterTemplate>
</asp:Repeater>

</ContentTemplate>

</asp:UpdatePanel>

背后的代码

 protected void btnSearch_Click(object sender, EventArgs e)
    {

        //Do Validation
        string product = tbProduct.Text;

        //Do database calls here
        Thread.Sleep(2000); //Simulate long search time

        var dt = new DataTable();
        dt.Columns.Add("Product");
        dt.Columns.Add("Price");

        for (int i = 0; i < 10; i++) {
            dt.Rows.Add(String.Format("Product {0} {1}", product, i), i * 10);
        }

        grdvProducts.DataSource = dt;
        grdvProducts.DataBind();

        rProducts.DataSource = dt;
        rProducts.DataBind();

    }