【问题标题】:ASP.NET MVC - getting the value of a selected index in a ListboxASP.NET MVC - 获取列表框中选定索引的值
【发布时间】:2021-11-29 02:44:57
【问题描述】:

我正在尝试将我的 ASP.NET Webforms 项目迁移到 ASP.NET MVC(用于学习目的)。我需要从 ASP.NET MVC 中的列表框中获取所选索引的值,并使用此索引对文本框中的字符串进行排序。这在我的 webforms 项目中非常简单:

<asp:ListBox ID="ListBox1" runat="server" AutoPostBack="True" 
     Height="166px" Width="198px" 
     BackColor="Black" Font-Bold="True" ForeColor="White" Font-Size="Small"
     OnSelectedIndexChanged="ListBox1_SelectedIndexChanged">
</asp:ListBox>

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <asp:TextBox ID="TextBox1" runat="server" 
            Height="149px" Width="286px" 
            TextMode="MultiLine" OnTextChanged="TextBox1_TextChanged" 
            AutoPostBack="True" Font-Bold="True" ForeColor="#006600">
        </asp:TextBox>
    </ContentTemplate>
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="ListBox1" 
             EventName="SelectedIndexChanged" />                              
    </Triggers>
</asp:UpdatePanel>

后面的代码是:

protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
{
     ...
     i = ListBox1.SelectedIndex;
     TextBox1.Text += ....// here is a string sorted based on the selected index i);
      ...                                        
}
          

尽管在 IT 论坛上搜索了两天,但我还没有找到在 ASP.NET MVC 中接收所选索引的方法。

我以这种方式在视图中填充列表框:

@Html.ListBoxFor(x => x.SelectedIndexes, new SelectList(Model.Entries, 
"Value", "Text"), new { id = "ListBox1", onchange = 
"selectedIndexChanged()", style = "width:198px; height:166px; color:white; 
background:black; font-weight:bold" })

在模型中创建条目列表并通过控制器发送到视图。它工作并且列表框被填充。但是在 ASP.NET MVC 中,似乎没有像 ListBox1.SelectedIndex 这样的东西。是否可以在客户端接收值(JavaScript 的语句:document.getElementById("ListBox1").selectedIndex),但似乎没有办法将这个值传输到服务器端。

有人知道如何提取所选索引的值并将其传输到模型中吗?

【问题讨论】:

  • 如果您想保持在同一页面上,您需要使用 ajax 将值发送到服务器。当你选择一个选项时,你想做什么?
  • 是的,这正是我想要做的(就像在我的 webforms 项目中一样 - 请参阅上面的代码,至少我被告知它是 ajax)。刚刚获得了所选索引的帮助,我开始研究 ajax 如何与 ASP.NET MVC 一起使用,以及选择项目将如何触发事件(现在我使用提交按钮进行测试)。当然,我们将不胜感激任何帮助。
  • 你还没有解释你想要什么,所以当你选择一个选项时! $('#SelectedIndexes').change(function() { var selected = $(this).val(); $.post(your url, { id: selected }. function(data) { do somethng with the data you return }); });
  • 并摆脱onchange = "selectedIndexChanged()"(使用Unobtrusive Javascritpt)。并替换您的 style attribute with a class. And it already looks like Model.Entries` 是 IEnumerable&lt;SelectList&gt; 因此在视图中使用 new SelectList(..) 创建另一个相同的是没有意义的。
  • 对不起...我想使用选定的索引对模型中的一些字符串值进行排序,然后在文本框中显示这些值。您可以在原始 webforms 项目中看到功能(仅用于我的学习目的,所以不要把那里的文字看得太重)specdictionary-001-site1.etempurl.com/ContactsEN.aspx,用户名:Klient,密码:1234

标签: c# asp.net-mvc listbox


【解决方案1】:

ListBoxFor() 接受IEnumerable&lt;SelectListItem&gt; 作为参数,因此您不必在此处使用 SelectList。您可以使用 linq 生成项目,在您的情况下,您可以将 new SelectList(Model.Entries, "Value", "Text") 替换为 Model.Entries.Select((e, i) =&gt; new SelectListItem { Text = e.Text, Value = i.ToString() })

【讨论】:

    【解决方案2】:

    在 MVC 中,控制器使用 HTML 的 name 属性自动将 HTML 视图中的值绑定到模型。 因此,您应该在接收参数 Model 和 Razor 语法中使用相同的名称,例如(使用 property name="ListBox1" 使其被服务器本身理解):

    @Html.ListBoxFor(x => x.SelectedIndexes, new SelectList(Model.Entries, 
        "Value", "Text"), new{ id ="ListBox1",name="ListBox1", 
         onchange="selectedIndexChanged()", 
         style = "your css" })
    

    【讨论】:

    • 您的问题令人困惑!这就是我的理解。具体告诉您是想在 Controller 中接收选定的值,还是想在更改下拉列表中使用 DOM?
    • 我想收到将要使用的模型中所选索引的编号。
    • 所以你可以使用我提供的方式来实现它
    • 非常感谢您的帮助 :-)。我在绑定方面也遇到了一些问题,但现在它可以工作了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多