gpt4 book ai didi

asp.net - 如何在不使用数据库的情况下重新实例化动态 ASP.NET 用户控件?

转载 作者:行者123 更新时间:2023-12-02 15:58:33 26 4
gpt4 key购买 nike

我目前正在处理使用动态 Web 用户控件的应用程序的一部分,并且在找出使用 ViewState 或其他一些方法在回发时重新实例化控件的最佳方法时遇到了一些麻烦。不需要我在每次回发时查询数据库。

基本上,我的页面上有一个用户控件,其中包含一个用于保存可变数量的子用户控件的面板和一个显示“添加控件”的按钮,其功能非常不言自明。

子用户控件非常简单;它只是一个删除按钮、一个下拉菜单和一个排成一行的时间选择器控件。每当用户单击父控件上的“添加控件”按钮时,就会将一个新“行”添加到包含子控件的面板中。

我想要做的是能够向该集合添加和删除控件、修改值以及执行“内存中”所需的任何操作,而无需对数据库进行任何调用。添加完控件并填充其值后,我想单击“保存”以立即将控件中的所有数据保存/更新到数据库。目前我找到的唯一解决方案是简单地将每次回发的数据保存在数据库中,然后使用数据库中存储的行来重新实例化回发时的控件。显然,这迫使用户违背自己的意愿将更改保存到数据库,并且如果他们想要取消使用控件而不保存数据,则必须完成额外的工作以确保删除先前提交的行。

根据我对使用动态控件的了解,我知道最好在生命周期的初始化阶段将控件添加到页面,然后在加载阶段填充它们的值。我还了解到,确保可以保留控件 View 状态的唯一方法是确保为每个动态控件提供唯一的 ID,并确保在重新实例化控件时为其分配完全相同的 ID。我还了解到 ViewState 直到生命周期中的 Init 阶段之后才真正被加载。这就是我的问题所在。如果我无法使用 View 状态并且不想对数据库执行任何调用,如何存储和检索这些控件的名称?使用 ASP.net 是否可以进行这种内存中操作/批量保存值?

非常感谢任何帮助,

迈克

最佳答案

您可以将重新创建控件所需了解的最少内容存储在 session 中保存的集合中。 session 在页面的初始化阶段可用。

这是一个供您引用的示例。它包括:

默认.aspx、cs
- 存储用户控件的面板
- “添加控制按钮”,每次单击时都会添加一个用户控件

TimeTeller.ascx、cs
- 有一个名为 SetTime 的方法,它将控件上的标签设置为指定时间。

默认.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="DynamicControlTest._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Panel ID="pnlDynamicControls" runat="server">
</asp:Panel>
<br />
<asp:Button ID="btnAddControl" runat="server" Text="Add User Control"
onclick="btnAddControl_Click" />
</div>
</form>
</body>
</html>

默认.aspx.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace DynamicControlTest
{
public partial class _Default : System.Web.UI.Page
{
Dictionary<string, string> myControlList; // ID, Control ascx path

protected void Page_Load(object sender, EventArgs e)
{

}

protected override void OnInit(EventArgs e)
{
base.OnInit(e);

if (!IsPostBack)
{
myControlList = new Dictionary<string, string>();
Session["myControlList"] = myControlList;
}
else
{
myControlList = (Dictionary<string, string>)Session["myControlList"];

foreach (var registeredControlID in myControlList.Keys)
{
UserControl controlToAdd = new UserControl();
controlToAdd = (UserControl)controlToAdd.LoadControl(myControlList[registeredControlID]);
controlToAdd.ID = registeredControlID;

pnlDynamicControls.Controls.Add(controlToAdd);
}
}
}

protected void btnAddControl_Click(object sender, EventArgs e)
{
UserControl controlToAdd = new UserControl();
controlToAdd = (UserControl)controlToAdd.LoadControl("TimeTeller.ascx");

// Set a value to prove viewstate is working
((TimeTeller)controlToAdd).SetTime(DateTime.Now);
controlToAdd.ID = Guid.NewGuid().ToString(); // does not have to be a guid, just something unique to avoid name collision.

pnlDynamicControls.Controls.Add(controlToAdd);

myControlList.Add(controlToAdd.ID, controlToAdd.AppRelativeVirtualPath);
}
}
}

TimeTeller.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TimeTeller.ascx.cs" Inherits="DynamicControlTest.TimeTeller" %>
<asp:Label ID="lblTime" runat="server"/>

TimeTeller.ascx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace DynamicControlTest
{
public partial class TimeTeller : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{

}

public void SetTime(DateTime time)
{
lblTime.Text = time.ToString();
}

protected override void LoadViewState(object savedState)
{
base.LoadViewState(savedState);
lblTime.Text = (string)ViewState["lblTime"];
}

protected override object SaveViewState()
{
ViewState["lblTime"] = lblTime.Text;
return base.SaveViewState();
}
}
}

如您所见,我仍然需要管理用户控件的内部 View 状态,但 View 状态包将保存到页面并在回发时交回给控件。我认为重要的是要注意我的解决方案与大卫的解决方案非常接近。我的示例中唯一的主要区别是它使用 session 而不是 View 状态来存储控制信息。这允许在初始化阶段发生一些事情。需要注意的是,此解决方案会占用更多服务器资源,因此在某些情况下可能不合适,具体取决于您的扩展策略。

关于asp.net - 如何在不使用数据库的情况下重新实例化动态 ASP.NET 用户控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1324003/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com