0

我有级联下拉菜单,通过 jquery ajax 填充。点击链接获取示例代码 下载示例代码

导致异常的步骤:

1:选择ModelYear,Make和Model

2:单击“清除按钮”以重置下拉列表,这就是它引发异常的时候。

我怎样才能摆脱这个错误?我有一种奇怪的方法可以通过在清除单击时设置隐藏字段来规避它,但是我将在页面上有很多其他控件可以进行回发,并且我的解决方法变得笨拙,我正在寻找一个真正的解决方案。

可能是我做错了什么,但欢迎任何指针。

我对链接进行了一些访问更改。请尝试让我知道这是否有效。

编辑:该示例是使用 VS2005 / .NET 2.0 和 WinXP 开发的,但服务器将是 Win2003。

4

2 回答 2

0

我已经检查了您的代码,我认为一个快速简便的解决方法是检查请求是否来自清除按钮。如果您按下清除按钮,基本上我不会调用 ReloadDropDownSelection()。

public partial class CascadingUC : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            ModelYears.Attributes.Add("onchange", "OnModelYearChange()");
            Makes.Attributes.Add("onchange", "OnMakeChange()");
            Models.Attributes.Add("onchange", "OnModelChange()");
            LoadMakes();
            LoadModels();
        }
        else
        {
            if ((Request.Form["btnClear"]==null)||(Request.Form["btnClear"] != "Clear"))
                ReloadDropDownSelection();
        }
    }

正如我在评论中告诉你的那样,我认为这里的问题是视图状态。您在服务器端加载组合 (PopulateDropDownList),然后在客户端更改项目。

我花了几年时间与这些东西(asp.net、viewstate、数千个事件)作斗争,当 ASP.NET MVC 出现时,我看到了曙光;-) 我真的非常讨厌 ASP.NET 网络表单。我想这几乎是个笑话。

于 2011-03-03T08:46:08.143 回答
0

我使用 HiddenField 的解决方法来决定是否应在回发时重新加载下拉列表。单击按钮后,我设置隐藏字段值。

编辑: 我发现绕过错误的另一种方法是将我的 DropDown Databind 包含在 try 块中并有一个空的 catch。

try
{
    ddl.DataSource = list;
    ddl.DataTextField = "Text";
    ddl.DataValueField = "Value";
    ddl.DataBind();
}
catch{}

就我的代码而言,我还没有看到任何副作用。

注意:总是有一个空的 catch 块来吞噬错误并不是一个好主意。

于 2011-03-25T19:56:37.827 回答