You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# MVC如何基于IEnumerable数据创建下拉列表?

解决ASP.NET MVC中货币下拉列表创建问题

问题分析

你遇到的问题核心有三点:

  1. Html辅助方法拼写错误:@Html.Dropdownlist的正确写法是@Html.DropDownList(C#大小写敏感),错误的方法名会直接抛出异常。
  2. 控件名称无效:第一个参数填"String"不符合后端参数绑定逻辑,应该对应你要接收的参数名(比如fromCurrency或toCurrency)。
  3. 数据加载时机错误:你把货币列表的赋值放在HttpPost方法中,页面首次加载是GET请求,此时ViewBag.currenciesList为空,转换SelectList时会报错。

修正步骤

1. 后端添加GET方法(页面加载时加载货币数据)

在控制器中添加无参数的GET方法,用于页面首次加载时获取货币列表并赋值给ViewBag:

public ActionResult ConvertCurrencies()
{
    var nbpApiUrl = RatesExchangeServices.tableAUrl;
    var currenciesList = new List<string>();

    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri(nbpApiUrl);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        HttpResponseMessage response = client.GetAsync(nbpApiUrl).Result;
        if (!response.IsSuccessStatusCode)
        {
            throw new Exception("无法连接到API");
        }

        string responseContent = response.Content.ReadAsStringAsync().Result;
        dynamic jsonResponse = JsonConvert.DeserializeObject(responseContent);
        
        foreach (var rate in jsonResponse[0].rates)
        {
            currenciesList.Add(rate.code.ToString());
        }
    }

    ViewBag.currenciesList = new SelectList(currenciesList);
    return View();
}

2. 修正POST方法(确保提交后下拉列表仍有效)

如果提交表单后需要返回原视图,需在POST方法中重新赋值ViewBag,避免下拉列表为空:

[HttpPost]
public ActionResult ConvertCurrencies(decimal amount, string currencyCode, string fromCurrency, string toCurrency)
{
    // 这里添加你的货币转换逻辑
    // 例如:计算转换结果并存入ViewBag
    // ViewBag.ConversionResult = ...;

    // 重新加载货币列表,确保返回视图时下拉列表正常显示
    var nbpApiUrl = RatesExchangeServices.tableAUrl;
    var currenciesList = new List<string>();

    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri(nbpApiUrl);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        HttpResponseMessage response = client.GetAsync(nbpApiUrl).Result;
        if (response.IsSuccessStatusCode)
        {
            string responseContent = response.Content.ReadAsStringAsync().Result;
            dynamic jsonResponse = JsonConvert.DeserializeObject(responseContent);
            
            foreach (var rate in jsonResponse[0].rates)
            {
                currenciesList.Add(rate.code.ToString());
            }
        }
    }

    ViewBag.currenciesList = new SelectList(currenciesList);
    return View();
}

3. 修改视图中的下拉列表代码

修正方法名拼写,并将控件名称改为与后端参数对应的名称:

@Html.DropDownList("fromCurrency", ViewBag.currenciesList as SelectList, "选择货币", new { @class = "form-control" })

若需要第二个下拉列表(如toCurrency),复制上述代码并修改第一个参数为"toCurrency"即可。

额外优化建议

避免使用dynamic解析JSON,建议创建强类型模型接收API返回数据,提升代码可读性与类型安全性:

public class CurrencyRate
{
    public string currency { get; set; }
    public string code { get; set; }
    public decimal mid { get; set; }
}

public class CurrencyResponse
{
    public string table { get; set; }
    public string no { get; set; }
    public string effectiveDate { get; set; }
    public List<CurrencyRate> rates { get; set; }
}

后端用强类型解析:

var jsonResponse = JsonConvert.DeserializeObject<List<CurrencyResponse>>(responseContent);
foreach (var rate in jsonResponse[0].rates)
{
    currenciesList.Add(rate.code);
}

内容的提问来源于stack exchange,提问作者JJablonski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 01:22:16