【问题标题】:Yet another viewstate dropdownlist issue另一个视图状态下拉列表问题
【发布时间】:2012-11-12 13:14:03
【问题描述】:

我在网络表单的Page_Load 方法中有以下代码:

protected void Page_Load(object sender, EventArgs e)
{
    CountrySelectButton.Click += new EventHandler(CountrySelectButton_Click);

    if (HomePage.EnableCountrySelector) //always true in in this case
    {
        if(!IsPostBack)
            BindCountrySelectorList();
    }
}

BindCountrySelectorList 方法如下所示:

private void BindCountrySelectorList()
{
    NameValueCollection nvc = HttpUtility.ParseQueryString(HomePage.CountryList);

    var ds = nvc.AllKeys.Select(k => new { Text = k, Value = nvc[k] });

    CountrySelector.DataSource = ds;
    CountrySelector.DataTextField = "Text";
    CountrySelector.DataValueField = "Value";
    CountrySelector.DataBind();
}

我有一个LinkButton click 事件处理程序,它从SelectList 获取SelectedValue,如下所示:

void CountrySelectButton_Click(object sender, EventArgs e)
{
    //get selected
    string selectedMarket = CountrySelector.SelectedValue; //this is always the first item...

    //set cookie
    if (RememberSelection.Checked)
        Response.Cookies.Add(new HttpCookie("blah_cookie", selectedMarket) { Expires = DateTime.MaxValue });

    //redirect
    Response.Redirect(selectedMarket, false);
}

编辑:

这是 DDL 和 LinkBut​​ton 的定义:

<asp:DropDownList runat="server" ID="CountrySelector" />
<asp:LinkButton runat="server" ID="CountrySelectButton" Text="Go" />

结果标记:

<select name="CountrySelector" id="CountrySelector">
    <option value="http://google.com">UK</option>
    <option value="http://microsoft.com">US</option>
    <option value="http://apple.com">FR</option>
</select>
<a id="CountrySelectButton" href="javascript:__doPostBack('CountrySelectButton','')">Go</a>

结束编辑

ViewState 已启用,但SelectedValue 属性只返回列表中的第一个项目,而不管实际选择了哪个项目。我确定我遗漏了一些明显的东西,但我找不到问题;非常感谢任何帮助。

提前致谢。

戴夫

【问题讨论】:

  • @MikeSmithDev - 有什么特别想看的吗?这就是背后的所有代码,所以我不确定我还能提供什么。
  • 是的,您的选择列表的代码前面。更多关于 LinkBut​​ton 的事件处理程序。链接按钮代码前面。你有没有调试过,看看发生了什么,比如你在某个地方重新绑定?
  • @MikeSmithDev - 我添加了 DDL 和 LinkBut​​ton 代码。我从事件处理程序中删除了所有其他内容,并在调试时检查了 SelectedValue 以确保它不是由任何其他操作引起的。我看不到它可能再次重新绑定的任何地方,但这是一个有效的问题,所以我将返回代码并检查...
  • 你能粘贴下拉列表的结果html吗?它可能会更深入地了解实际写入客户端的内容。问题可能出现在流程的该步骤中。
  • 如果这就是你所做的一切,你的代码就可以工作。我怀疑你没有显示更多的事情......比如ID如何从“SelectList”变为“CountrySelector”。 runat=server 标签的默认 ID 重命名看起来更像

标签: c# asp.net webforms viewstate


【解决方案1】:

您是正确的,您的问题源于 jquery ui 对话框...您可以通过使用隐藏字段记录下拉列表的值来解决此问题。然后在您的代码中,引用隐藏字段。

前端可能如下所示:

<div id="myModal" style="display: none;">
        <asp:DropDownList runat="server" ID="SelectList" />
        <asp:LinkButton runat="server" ID="MyButton" Text="Go" />
    </div>
    <input type="hidden" id="countryVal" runat="server" />
    <a id="choose" href="#">Choose</a>
    <script type="text/javascript">
        $(document).ready(function () {

            $('#choose').click(function () {
                $('#myModal').dialog({
                });
                return false;
            });

            $('#<%= SelectList.ClientID %>').change(function () {
               var country = $(this).val();
               $('#<%= countryVal.ClientID %>').val(country);
            });
        }); 
    </script>

然后你的代码在后面:

var selected = countryVal.Value;

【讨论】:

  • 如果您使用隐藏字段,则必须执行额外的验证,如果您坚持使用 DropDownList,您已经获得了这些验证。另一种方法是绑定$(document).on('submit', function() ... 获取jQuery 模态容器,并将其附加回&lt;form&gt;。 jQuery modal 将您的输入元素移到 &lt;form&gt; 元素之外,这就是为什么值的行为与您期望的不同。
  • 不错的建议。我需要检查一下。
【解决方案2】:

将 MyButton.Click+=... 语句包装在 (!IsPostBack) 中,如

if(!IsPostBack)
{
   MyButton.Click += new EventHandler(MyButton_Click);
   BindSelectList();
}

【讨论】:

  • 感谢您的建议,但这会阻止我的按钮在回发时绑定其事件,并且没有解决手头的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 2015-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多