C# 通过控制器操作填充下拉列表

C# 通过控制器操作填充下拉列表,c#,asp.net-mvc,razor,asp.net-core-mvc,html.dropdownlistfor,C#,Asp.net Mvc,Razor,Asp.net Core Mvc,Html.dropdownlistfor,我必须从键等于显示值的列表中填充下拉列表。我来提取这些值,我做了各种测试以连接到视图,但没有成功。给定提取值的代码: public async Task<IActionResult> PopulateDropDownList() { try { var items = await DocumentDBRepository<CosmosDBTelemetry>.GetDeviceIds(); List<string>

我必须从键等于显示值的
列表中填充
下拉列表
。我来提取这些值,我做了各种测试以连接到
视图
,但没有成功。给定提取值的代码:

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);
     }
}
public异步任务PopulateDropDownList()
{
尝试
{
var items=await DocumentDBRepository.getDeviceID();
列表设备ID=新列表();
foreach(项目中的var项目)
{
添加(item.deviceId);
}
返回视图();
}
捕获(例外e)
{
投掷(e);
}
}

有人能帮我做其他事情吗?

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

首先,您需要区分动作和助手方法。动作是控制器类中的公共方法。用户可以通过URL访问操作,因此在您的情况下,操作将是有效的URL,尽管这对用户来说毫无意义。相反,您需要将
PopulateDropDownList
设置为一个助手方法,如下所示:

private异步任务getDropDownOptions列表()
{
清单项目=。。。;
退货项目;
}
然后,通过URL操作调用帮助程序,例如

公共异步任务视图()
{
列表项=等待GetDropDownstoptions();
返回视图(项目);
}
您可能希望查看以获取有关控制器操作的信息

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

@model IEnumerable
@foreach(模型中的字符串项)
{
@项目
}
@model IEnumerable
指令指定视图希望将字符串列表传递到视图中。
@foreach(模型中的字符串项)
迭代列表中的每个字符串,并为每个字符串生成一个
选项
元素

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

private async void PopulateDropDownList()
{
清单项目=。。。;
ViewBag.Items=项目;
}
那么您的视图将如下所示:


@foreach(在(IEnumerable)ViewBag.Items中的字符串项)
{
@项目
}
我希望这有帮助

您有两个选择

选项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();
}
public异步任务PopulateDropDownList()
{
var项目=等待
DocumentDBRepository.getDeviceID();
列表设备ID=新列表();
foreach(项目中的var项目)
{
添加(item.deviceId);
}
ViewData[“设备ID”]=设备ID;
返回视图();
}
MyViewPage.cshtml

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

选择一个选项
@foreach(字符串deviceid in((列表)ViewData[“deviceid”]))
{
@设备ID
}
选项2

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

MyViewPage.cshtml

<select>
        <option value="">Select an option</option>
      @foreach (string deviceid in ((List<string>)ViewData["deviceids"]))
      {
        <option value="@deviceid">@deviceid</option>
      }
    </select> 
@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> 
@code
var items=DocumentDBRepository.getDeviceID();
列表设备ID=新列表();
foreach(项目中的var项目)
{
添加(item.deviceId);
}
结束代码
选择一个选项
@foreach(deviceid中的字符串deviceid)
{
@设备ID
}

如何调用控制器方法?我必须在同一页上使用几个不同的模型。您可能希望将
PopulateDropDownList
方法作为助手方法而不是操作调用。您还需要使用
ViewBag
ViewData
对象。请参阅我上面的编辑。如果我想在Web API中执行相同的操作,我必须怎么做?所有这些代码都应该可以传输到Web API。请记住,公共方法是客户端可以访问的URL。例如,如果要定义返回整数列表的API端点,则方法签名将是
public IEnumerable GetIntegerList()
public async Task GetIntegerList()
,具体取决于该方法是同步还是异步的。有关更多信息,请参阅。以及中的如何使用控制器方法连接页面?谢谢。我选择选项1。Simone@SimoneSpagna只是使目标页和控制器方法具有相同的名称。i、 (PopulateDropDownList.cshtml)。这不是我的情况。下拉列表位于一个使用多个模型的复杂页面中。如果我想在Web API中执行相同的操作,我必须怎么做?