所以,我有一个 ASP 下拉列表(这是 .net 2.0)。我将它与数据绑定(bind)。基本上,当页面加载并且它不是回发时,我们将获取记录数据,绑定(bind)所有下拉菜单,并将它们设置为适当的值(严格来说,我们:使用数据库中的基本数据集初始化页面,绑定(bind)下拉菜单从 DB 中,从 DB 中获取实际记录数据,此时将 drown downs 设置为适当的设置)。我想要做的是有选择地设置列表选项的样式。所以数据库返回 3 项:ID、文本和一个标志,指示记录是否“事件”(我将适当设置样式)。这很容易做到,我已经做到了。
我的问题是表单提交停止时会发生什么。我们稍微扩展了 Page 类并创建了一个 AddError() 方法,该方法将创建失败的业务规则检查的错误列表,然后将它们显示在 ValidationSummary 中。它的工作原理是这样的,在提交按钮的点击事件中:
CheckBizRules();
if(Page.IsValid)
{
SaveData();
}
如果任何业务规则检查失败,则该页面将无效。问题是,当页面重新呈现(viewsate 已启用,但没有数据被反弹)时,我美丽的条件样式现在可悲地消失了,生活在丢失 socks 的土地上。我需要保存它。
我希望在这里避免另一个数据库调用(例如,如果页面无效,则再次从数据库中获取列表数据,只是为了重新设计列表的样式)。但如果那是我的行动方针,那不是世界末日。我希望有人可以提出替代建议。
我想不出如何更好地表达这个问题,如果有人有任何建议或需要澄清,请不要犹豫,如果需要的话,可以强行提出。 ;)
最佳答案
我不确定我是否完全理解您对下拉项应用了哪种样式,但控件似乎不会在回发中保留这种样式。因此,通常此类信息需要保存在 ViewState 中。 我看到两个选项(除了从数据库重新加载):
第一种方法:创建自己的下拉控件,继承自DropDownList。然后在设置项目样式时将样式数据保存在控件的 ViewState 包中:
public void SetItemActive(ListItem item)
{
ViewState[item.Value] = "active";
}
然后覆盖 OnRender
protected override void Render(HtmlTextWriter writer)
{
....
foreach(ListItem item in Items)
{
if ( ViewState[item.Value] == "active")
{
** RenderActiveItem **
}
else
{
** RenderNormalItem **
}
}
第二种方法:将事件 ID 保存在页面的 ViewState 中,然后使用来自 ViewState 而不是来自 DB 的数据在每次回发时重新设置下拉菜单的样式
关于ASP.net 下拉动态样式,然后在中止提交时记住样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/492177/