这可能是真正错误的做法,所以如果是,请告诉我!我有一个名为ucDropDownList.ascx的用户控件。除了它之外,它基本上是一个带有按钮的下拉菜单。单击该按钮时,将出现一个jquery对话框。对话框就是问题所在。由于这个用户控件在我想要的许多地方使用(在OOP的原则内),允许我们根据它的下拉来加载不同的形式......所以我去模板用户控制。这背后的代码如下:
public partial class ucDropDownList : System.Web.UI.UserControl
{
private ITemplate m_RecordForm = null;
[TemplateContainer(typeof(cPopUpContainer))]
[PersistenceMode(PersistenceMode.InnerProperty)]
public ITemplate RecordForm
{
get { return m_RecordForm; }
set { m_RecordForm = value; }
}
protected void Page_Load(object sender, EventArgs e)
{
}
void Page_Init()
{
// Load in the Template control (we use this for making the different types of form!
if (RecordForm != null)
{
cPopUpContainer container = new cPopUpContainer();
m_RecordForm.InstantiateIn(container);
phNewRecordForm.Controls.Add(container);
}
}
public event EventHandler SaveClicked;
protected void SaveButton_Clicked(object sender, EventArgs e)
{
if (SaveClicked != null)
SaveClicked(this, e);
}
}
public class cPopUpContainer: Control, INamingContainer
{
internal cPopUpContainer()
{
}
}
然后我(将)有几个用户控件,这些控件是我将拥有这些用户控件的每种类型的简单形式...(示例给出的是数据库中的状态表)。没有什么令人兴奋的,只是所有的控件都有viewState Enabled。 (几乎和标准一样)。
我展示这些的页面有一些像这样的标记......
<uc3:ucDropDownList ID="comboStatus" runat="server" OnSaveClicked="comboStatus_Saved">
<RecordForm>
<uc4:ucEdStatus ID="ucEdStatus1" runat="server" ViewStateMode="Enabled" />
</RecordForm>
</uc3:ucDropDownList>
和幕后一样......
protected void Page_Init(object sender, EventArgs e)
{
if (!IsPostBack)
{
ucEdStatus statForm = comboStatus.Controls[3].Controls[0].FindControl("ucEdStatus1") as ucEdStatus;
statForm.InitializeControl(false);
}
}
protected void Page_Load(object sender, EventArgs e)
{
}
protected void comboStatus_Saved(object sender, EventArgs e)
{
ucEdStatus statForm = comboStatus.Controls[3].Controls[0].FindControl("ucEdStatus1") as ucEdStatus;
statForm.SaveRecord(eSaveUCEdType.Insert);
}
当SaveRecord运行时(此方法是基于ucEdStatus1控件上各种控件的值的简单数据库插入),ucEdStatus上的控件都是标记中设置的默认值,而非维护用户输入的内容(因此保存只会保存错误的数据位)。
我愿意接受建议和批评。如果您需要更多信息我可以给您,我只需要帮助理解为什么会这样。
EDIT 万一你们想知道这是ucEdStatus控件的类。它可能会回答为什么我仍在挠头或可能表明我有多愚蠢。
long m_RecordID
{
get { return (ViewState["recordid"] != null ? Convert.ToInt64(ViewState["recordid"]) : -1); }
set { ViewState["recordid"] = value; }
}
bool m_isSupport
{
get { return (ViewState["isSupport"] != null ? Convert.ToBoolean(ViewState["isSupport"]) : false); }
set { ViewState["isSupport"] = value; }
}
protected void Page_Load(object sender, EventArgs e)
{
}
//--------------------------------------------------------------------------------
public void InitializeControl(bool aIsSupport)
{
//Setup the issupport variable
m_isSupport = aIsSupport;
//Add the importance to the mixup...
Array importanceTexts = System.Enum.GetNames(typeof(eStatusImportance));
for (int i = 0; i <= importanceTexts.Length - 1; i++)
{
ListItem item = new ListItem(importanceTexts.GetValue(i).ToString(), i.ToString());
comboImportance.Items.Add(item);
}
}
//--------------------------------------------------------------------------------
public long SaveRecord(eSaveUCEdType aSaveType)
{
using (cDBConnection con = new cDBConnection(this.Page, true))
{
cStatus stat = new cStatus(con.Con, m_RecordID);
if (m_RecordID == -1)
stat.Id = cGlobalDB.NewKey();
stat.Importance = Convert.ToInt32(comboImportance.SelectedValue);
stat.Name = txtName.Text;
stat.Issupport = m_isSupport;
stat.Color = edColor.Color;
stat.SaveChanges((aSaveType == eSaveUCEdType.Insert ? eUpdateType.insert : eUpdateType.update));
return (long)stat.Id;
}
}
答案 0 :(得分:0)
每次尝试在page_init中初始化该控件;换句话说,删除!IsPostback
支票。必须在页面初始化期间初始化所有控件,然后才能应用其视图状态信息。这与在aspx / ascx文件中定义asp.net控件完全等效(这些文件中的任何内容都经过相同的过程,由asp.net自动完成)。
答案 1 :(得分:0)
所以我经过一番环顾后找到了答案。 This site确实有帮助。问题是jquery模式弹出窗口(对话框)在回发后丢失了。一线修复。多么令人沮丧!