2016-01-08 35 views
0

我一直在碰撞这个问题一周,所以我想我最好打电话给专家:)。在回发中加载特定的动态用户控件

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

当我在其中一个控件中进行回发时,会发生此问题。发生回发时,“Page_Init”事件会在回发中执行代码之前重新生成所有动态控件。根据页面生命周期模型,一切正常。但是,由于回发仅发生在其中一个控件中,因此我希望如果只有控制重新呈现。因为现在所有三个控件都会重新渲染,这会让用户感到分心。

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

因此,在短期:

- >有相当复杂的服务器端代码三个功能动态控制。正确运行功能。无法转换为纯Javascript/Web服务代码。

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

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

谢谢!

+0

使用UpdatePanel – Khazratbek

+0

https://msdn.microsoft.com/en-us/library/bb399001.aspx – Khazratbek

+0

感谢您的回复。我确实有很多更新面板,但他们没有解决问题。看起来好像我的一个Javascript延迟太长了。不完全解决问题,但有帮助。我最初的想法是像Dojo加载器那样,网页的一部分可以在没有其他人刷新的情况下更新,但似乎手动编写这样的代码非常困难。 – GertV

回答

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一样更新中继器,无需回传并移动光标或其他内容。

+0

谢谢,这有助于很多。我唯一剩下的问题是Javascript在对象重新创建时执行。由于Javascript在对象重新创建后执行,所以更改不会存储在视图状态中,并且必须在页面加载后重新创建,这可能会让视觉更加分散注意力,例如重新生成Highcharts图表。不过,我认为这是由于一些内部计时器造成的。 – GertV

+0

@GertV您可以添加执行的JavaScript函数到您* ShowMore_Click *方法: – Khazratbek

+0

@GertV我举一个简单的例子 – Khazratbek