【问题标题】:Populate a dropdown list via controller action通过控制器操作填充下拉列表
【发布时间】:2019-07-27 01:05:28
【问题描述】:

我必须从List<string> 填充dropdown list,其中键等于显示的值。我想提取这些值,我做了各种测试以连接到View,但没有成功。给定提取值的代码:

public async Task<IActionResult> PopulateDropDownList()
{
    try
    {
        var items = await DocumentDBRepository<CosmosDBTelemetry>.GetDeviceIds();
        List<string> deviceids = new List<string>();

        foreach(var item in items)
        {
            deviceids.Add(item.deviceId);
        }

        return View();
      }
      catch (Exception e)
      {
        throw (e);
     }
}

谁能帮我解决剩下的问题?

【问题讨论】:

    标签: c# asp.net-mvc razor asp.net-core-mvc html.dropdownlistfor


    【解决方案1】:

    在模型-视图-控制器 (MVC) 框架中,控制器的工作是将模型传递给视图。假设您的字符串列表 items 已正确填充,控制器需要将其传递给视图。

    首先,您需要区分操作和辅助方法。动作是控制器类中的公共方法。用户可以通过 URL 访问操作,因此在您的情况下,http://application_name/controller_name/PopulateDropDownList 将是一个有效的 URL,尽管这对用户没有意义。相反,您需要将 PopulateDropDownList 变成一个辅助方法,如下所示:

    private async Task<IEnumerable<string>> GetDropdownOptionsList()
    {
      List<string> items = ...;
      return items;
    }
    

    然后,从 URL 操作调用帮助程序,例如

    public async Task<IActionResult> View()
    {
      List<string> items = await GetDropdownListOptions();
      return View(items);
    }
    

    您可能希望查看this documentation 以获取有关控制器操作的信息。

    其次,View() 方法构造视图并将其发送给用户,但默认情况下,它不传递任何数据。您可以通过调用View(items) 而不是View() 将字符串列表传递给视图。然后,您的视图将如下所示:

    @model IEnumerable<string>
    
    <select>
      @foreach (string item in Model)
      {
        <option value="@item">@item</option>
      }
    </select>
    

    @model IEnumerable&lt;string&gt; 指令指定视图需要将字符串列表传递到视图中。 @foreach (string item in Model) 遍历列表中的每个字符串并为每个字符串生成一个option 元素。

    如果您需要将多个数据模型传递到视图中,您可以使用ViewBagViewData 对象。只需将 ViewBag.Items = items; 添加到您的 PopulateDropDownList 方法中,如下所示:

    private async void PopulateDropDownList()
    {
      List<string> items = ...;
      ViewBag.Items = items;
    }
    

    那么您的视图将如下所示:

    <select>
      @foreach (string item in (IEnumerable<string>)ViewBag.Items)
      {
        <option value="@item">@item</option>
      }
    </select>
    

    我希望这会有所帮助!

    【讨论】:

    • 控制器方法是怎么调用的?我必须在同一页面上使用几个不同的模型..
    • 您可能希望将PopulateDropDownList 方法作为辅助方法而不是操作来调用。您还想使用ViewBagViewData 对象。请参阅上面的编辑。
    • 如果我想在 Web API 中做同样的事情,我该怎么做?
    • 所有这些代码都应该可以转移到 Web API。请记住,公共方法是客户端可以访问的 URL。例如,如果您想定义一个返回整数列表的 API 端点 app/api/GetIntegerList,则方法签名将是 public IEnumerable&lt;int&gt; GetIntegerList()public async Task&lt;IEnumerable&lt;int&gt;&gt; GetIntegerList(),具体取决于方法是同步的还是异步的。请参阅this tutorial 了解更多信息。
    【解决方案2】:

    你有两个选择。

    选项 1

    从控制器检索数据并从 razor 页面访问它。

    MyController.cs

    public async Task<IActionResult> PopulateDropDownList()
    {
        var items = await 
                    DocumentDBRepository<CosmosDBTelemetry>.GetDeviceIds();
                    List<string> deviceids = new List<string>();
        foreach(var item in items)
        {
         deviceids.Add(item.deviceId);
        }
        ViewData["deviceids"] = deviceids;
    
        return View();
    }
    

    MyViewPage.cshtml

    <select>
            <option value="">Select an option</option>
          @foreach (string deviceid in ((List<string>)ViewData["deviceids"]))
          {
            <option value="@deviceid">@deviceid</option>
          }
        </select> 
    

    选项 2

    直接从 razor 页面检索和访问数据。

    MyViewPage.cshtml

    @Code
        var items =  DocumentDBRepository<CosmosDBTelemetry>.GetDeviceIds();
        List<string> deviceids = new List<string>();
        foreach(var item in items)
         {
         deviceids.Add(item.deviceId);
         }
    End Code
    
    <select>
        <option value="">Select an option</option>
      @foreach (string deviceid in deviceids)
      {
        <option value="@deviceid">@deviceid</option>
      }
    </select> 
    

    【讨论】:

    • 我如何将页面与控制器方法连接起来?非常感谢。我选择选项 1。Simone
    • @Simone Spagna 只需让目标页面和控制器方法具有相同的名称。即(PopulateDropDownList.cshtml)。
    • 这不是我的情况。下拉列表位于使用多个模型的复杂页面中。
    • 如果我想在 Web API 中做同样的事情,我该怎么做?
    猜你喜欢
    • 2020-03-09
    • 2021-12-24
    • 1970-01-01
    • 2019-01-02
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多