【问题标题】:Load specific dynamic user controls on postback在回发时加载特定的动态用户控件
【发布时间】:2016-04-12 20:38:20
【问题描述】:

一个星期以来我的头一直在与这个碰撞,所以我想我最好打电话给专家:)。

这个问题更像是一个美学问题,而不是实际的代码问题,但我怀疑它们可能是相关的。在我的程序中,我有一系列动态添加到网页的用户控件。这些用户控件可以包含几乎任何东西(在合理范围内),我现在使用的那些包含一个按钮和一个图表(通过 Javascript 生成),但可能会变得更复杂。动态控件是通过“Page_Init”事件添加的,并且全部呈现 100% 正确。我在这方面没有问题。

当我在其中一个控件中进行回发时,就会出现问题。当回发发生时,“Page_Init”事件会在执行回发中的代码之前重新生成所有动态控件。根据页面生命周期模型一切正常。但是,由于回发仅发生在其中一个控件中,我希望 only 该控件重新呈现。由于现在所有三个控件都重新渲染,这可能会分散用户的注意力。

有没有办法拦截按钮生成的回发并通过服务器上的 AJAX 处理它? Telerik 的“RadAjaxManager”做了类似的事情,但遗憾的是这个组件对我不可用,我不需要任何复杂的东西。我知道一个建议是使用 AJAX 和 Web 服务编写控件,但在我的场景中这太难了,因为动态控件可以包含它们自己的静态控件。

简而言之:

-> 具有三个功能性动态控件,具有相当复杂的服务器端代码。在功能方面正常工作。无法转换为纯 Javascript/Web 服务代码。

-> 当其中一个控件执行回发时,所有三个控件都会重新渲染。让用户分心,尤其是在涉及弹出窗口时。

-> 需要一种方法来仅重新渲染正在更新的控件。

谢谢!

【问题讨论】:

  • 感谢您的回复。我确实有很多更新面板,但它们并没有解决问题。好像我的 Javascript 延迟之一太长了。不能完全解决问题,但有帮助。我最初想到的是类似于 Dojo 加载器的东西,其中部分网页可以在不刷新其他部分的情况下更新,但似乎手动编写类似的东西非常困难。
  • 没那么难。让我举个例子。我会上传它作为答案

标签: jquery asp.net ajax postback


【解决方案1】:

设计页面:

<asp:ScriptManager ID="MainScriptManager" runat="server" />
<div class="row text-center text-white">
    <h2>
        <asp:Literal ID="litTitle" runat="server" Text="Feedbacks" />
    </h2>
</div>
<div class="row">
    <div>
        <asp:UpdatePanel ID="updFeedbacks" runat="server">
            <ContentTemplate>
                <asp:Repeater ID="rptFeedbacks" runat="server">
                    <ItemTemplate>
                        <div class="myFeedback">
                            <span><%#Eval("username") %></span>
                            <div class="text-white">
                                <%#Eval("feedback") %>
                            </div>
                        </div>
                    </ItemTemplate>
                    <SeparatorTemplate>
                        <hr />
                    </SeparatorTemplate>
                </asp:Repeater>
                <br />
                <div class="text-center">
                    <asp:Button ID="btnShowMore" runat="server" CssClass="trasparentButton" Font-Size="11" Text="Show more feedbacks" OnClick="btnShowMore_Click" />
                </div>
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
</div>

后面的代码:

private static int FeedbacksNumber = 10;
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
        BindRepeater(FeedbacksNumber);
}

protected void BindRepeater(int rows)
{
    SqlConnection con = new SqlConnection(Utils.Connection);
    SqlCommand cmd = new SqlCommand("select columns from table where rowsnumber < @num", con);
    cmd.Parameters.Add("@num", SqlDbType.Int).Value = rows;
    con.Open();
    SqlDataAdapter sda = new SqlDataAdapter(cmd);
    DataSet ds = new DataSet();
    sda.Fill(ds);
    rptFeedbacks.DataSource = ds;
    rptFeedbacks.DataBind();
    con.Close();
}

protected void btnShowMore_Click(object sender, EventArgs e)
{
    FeedbacksNumber += 10;
    BindRepeater(FeedbacksNumber);
}

当您点击显示更多反馈按钮时,正在加载另外 10 个反馈。它不会进行回发。它将像 javascript 一样更新转发器,无需回发和移动光标或其他任何东西。

【讨论】:

  • 谢谢,这对您有很大帮助。我唯一剩下的问题是在重新创建对象时执行 Javascript。由于 Javascript 在对象被重新创建后执行,因此更改不会存储在视图状态中,并且必须在页面加载后重新创建,这可能会分散视觉注意力,例如重新生成 Highcharts 图表。但是,我确实认为这是由于某些内部计时器造成的。
  • @GertV 您可以将执行 javascript 函数添加到您的 ShowMore_Click 方法中:
  • @GertV 我举个简单的例子
  • @GertV protected void btnShowMore_Click(object sender, EventArgs e) { FeedbacksNumber += 10; Response.Write(""); BindRepeater(FeedbacksNumber); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
相关资源
最近更新 更多