在回发时加载特定的动态用户控件
Load specific dynamic user controls on postback
一个星期以来我一直在思考这个问题,所以我想我最好请专家来 :) 。
这个问题与其说是一个实际的代码问题,不如说是一个审美问题,但我怀疑它们可能是相关的。在我的程序中,我有一系列动态添加到网页的用户控件。这些用户控件几乎可以包含任何内容(在合理范围内),我现在使用的控件包含一个按钮和一个图表(通过 Javascript 生成),但可能会变得更复杂。动态控件是通过 "Page_Init" 事件添加的,所有渲染都 100% 正确。我在这方面没有问题。
当我在其中一个控件中进行回发时出现问题。当回发发生时,"Page_Init" 事件会在执行回发中的代码之前重新生成所有动态控件。根据页面生命周期模型一切正常。但是,由于回发仅发生在其中一个控件中,因此我希望 only 控件重新呈现。由于现在所有三个控件都重新呈现,这可能会分散用户的注意力。
有没有办法拦截按钮生成的回发并通过服务器上的 AJAX 处理它? Telerik 的 "RadAjaxManager" 做的事情与此非常相似,但遗憾的是我无法使用该组件,我不需要那么复杂的东西。我知道一个建议是使用 AJAX 和 Web 服务编写控件,但在我的场景中这太难了,因为动态控件可以包含自己的静态控件。
简而言之:
-> 具有三个具有相当复杂服务器端代码的功能动态控件。明智地在功能上正常工作。无法转换为纯 Javascript/Web-service 代码。
-> 当其中一个控件执行回发时,所有三个控件都会重新呈现。会让用户分心,尤其是涉及弹出窗口时。
-> 需要一种方法来仅重新呈现正在更新的控件。
谢谢!
设计页面:
<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 生成),但可能会变得更复杂。动态控件是通过 "Page_Init" 事件添加的,所有渲染都 100% 正确。我在这方面没有问题。
当我在其中一个控件中进行回发时出现问题。当回发发生时,"Page_Init" 事件会在执行回发中的代码之前重新生成所有动态控件。根据页面生命周期模型一切正常。但是,由于回发仅发生在其中一个控件中,因此我希望 only 控件重新呈现。由于现在所有三个控件都重新呈现,这可能会分散用户的注意力。
有没有办法拦截按钮生成的回发并通过服务器上的 AJAX 处理它? Telerik 的 "RadAjaxManager" 做的事情与此非常相似,但遗憾的是我无法使用该组件,我不需要那么复杂的东西。我知道一个建议是使用 AJAX 和 Web 服务编写控件,但在我的场景中这太难了,因为动态控件可以包含自己的静态控件。
简而言之:
-> 具有三个具有相当复杂服务器端代码的功能动态控件。明智地在功能上正常工作。无法转换为纯 Javascript/Web-service 代码。
-> 当其中一个控件执行回发时,所有三个控件都会重新呈现。会让用户分心,尤其是涉及弹出窗口时。
-> 需要一种方法来仅重新呈现正在更新的控件。
谢谢!
设计页面:
<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 一样更新转发器,无需回发和移动光标或其他内容。