【问题标题】:How can I get the text of a selected option with ASP.NET MVC?如何使用 ASP.NET MVC 获取选定选项的文本?
【发布时间】:2009-08-25 20:44:51
【问题描述】:

我在 ASP.NET MVC 项目中有一个表单,它有一个类似于以下内容的选择下拉列表:

<select>
  <option value="ee5711b9-ec86-4378-a975-ae10a4ebedbc">Volvo Account</option>
  <option value="0dc0e9d8-2245-43de-81a9-5b94c19646fa">Saab Account</option>
  <option value="f9a05ef6-9ca6-4eeb-9e04-79726a62b38c">Mercedes Account</option>
  <option value="1c5c2e43-06d6-4b7d-916a-231be535a608">Audi Account</option>
</select>

在项目的后面页面中,我需要对 GUID 标识符做一些事情,但首先我需要提示用户进行确认。显然 GUID 对他们来说毫无用处,他们希望看到更友好的名称(即“Volvo Account”)。

但是当我深入研究 FormCollection 值时,我能得到的只是值,而不是所选选项的文本。考虑到设计目标,这很有意义,但我怎样才能在文本值上进行 POST?

我可以想到一些解决方法(使用 JavaScript 设置隐藏字段,使用 GUID 和填充此字段的相同方法进行事后查找,等等)但是有什么内在的方法可以做到这一点我'我失踪了?

【问题讨论】:

    标签: asp.net-mvc select options


    【解决方案1】:

    没有内在的方法可以做到这一点,JavaScript 确实是您的最佳选择。

    为您的 SELECT 添加一个“onchange”事件处理程序,将隐藏输入的值设置为所选 OPTION 的显示值。

    【讨论】:

    • 如果值永远不会改变怎么办?我不同意它,但是客户想要的方式,列表中的第一个值是有效的(所以如果他们不想更改它可以直接点击)
    • 您可以很容易地设置隐藏输入的值以匹配视图中的 SELECT 输入的值,并让 JavaScript 连线处理更改。您可以运行一个页面就绪脚本,并在页面加载后将隐藏输入设置为所选值。
    【解决方案2】:

    我通常在 MVC 中使用模型中的 Collection 类中的静态属性来处理下拉/选择框。

    例子:

    using System.Collections.Generic;
    
    namespace SomeProject.Models
    {
        public class Collections
        {
            public static Dictionary<string, string> AccountType = new Dictionary<string, string>
            {
                { "", "" },
                { "ee5711b9-ec86-4378-a975-ae10a4ebedbc", "Volvo Account" },
                { "0dc0e9d8-2245-43de-81a9-5b94c19646fa", "Saab Account" },
                { "f9a05ef6-9ca6-4eeb-9e04-79726a62b38c", "Mercedes Account" },
                { "1c5c2e43-06d6-4b7d-916a-231be535a608", "Audi Account" }
            };
        }
    }
    

    然后我会在视图中渲染 DropDown,如下所示:

    <%= Html.DropDownList("AccountType", new SelectList(SomeProject.Models.Collections.AccountType, "Key", "Value", Convert.ToString(ViewData["AccountType"])), "", new { tabindex = "3", @class = "dropdown" }) %>
    

    现在您的整个应用程序都可以使用该 Collection。您可以通过以下方式获取任何用户友好的名称:

    SomeProject.Models.Collections.AccountType[ViewData["AccountType"]]
    

    如果您愿意,您甚至可以将集合渲染到视图。

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      使用隐藏字段:

      <select>
          <option value="ee5711b9-ec86-4378-a975-ae10a4ebedbc">Volvo Account</option>
          <option value="0dc0e9d8-2245-43de-81a9-5b94c19646fa">Saab Account</option>
          <option value="f9a05ef6-9ca6-4eeb-9e04-79726a62b38c">Mercedes Account</option>
          <option value="1c5c2e43-06d6-4b7d-916a-231be535a608">Audi Account</option>
      </select>
      ...
      <input type="hidden" name="Options[0].Key" value="ee5711b9-ec86-4378-a975-ae10a4ebedbc" />
      <input type="hidden" name="Options[0].Value" value="Volvo Account" />
      <input type="hidden" name="Options[1].Key" value="0dc0e9d8-2245-43de-81a9-5b94c19646fa" />
      <input type="hidden" name="Options[1].Value" value="Saab Account" />
      ...
      

      控制器:

      public ActionResult SomeAction(..., IDictionary<string, string> options)
      {
          string selectedValue = ...;
          string selectedText = options[selectedValue];
      }  
      

      【讨论】:

        猜你喜欢
        • 2010-11-26
        • 1970-01-01
        • 1970-01-01
        • 2013-02-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多