C# MVC如何基于IEnumerable数据创建下拉列表?
解决ASP.NET MVC中货币下拉列表创建问题
问题分析
你遇到的问题核心有三点:
- Html辅助方法拼写错误:
@Html.Dropdownlist的正确写法是@Html.DropDownList(C#大小写敏感),错误的方法名会直接抛出异常。 - 控件名称无效:第一个参数填"String"不符合后端参数绑定逻辑,应该对应你要接收的参数名(比如
fromCurrency或toCurrency)。 - 数据加载时机错误:你把货币列表的赋值放在
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
相关产品推荐
相关产品推荐

