ASP.NET开发:如何在Index页面直接调用Controller方法填充下拉框
控制器Action直接填充下拉列表的实现方案
首先你原有代码中的getRooms是私有方法,无法被路由系统或外部请求访问,需要先在控制器中封装一个公开的Action接口供调用。
方案1:前端异步调用Action(无需ViewBag/ViewData)
该方式不需要修改Index页面对应的Action逻辑,页面加载完成后异步拉取选项填充,适合选项可能动态变化的场景。
控制器代码修改
// 新增公开Action,返回房间列表的JSON结果 public IActionResult GetRooms() { // 此处替换为你实际获取DbSet<RmRoom>的逻辑,比如从注入的DbContext中取 var rooms = getRooms(_context.RmRooms); return Json(rooms); } // 原有私有方法保留 private SortedSet<string> getRooms(DbSet<RmRoom> rmRooms) { var roomNameSet = new SortedSet<string>(); foreach (var item in rmRooms) { roomNameSet.Add(item.Name); } return roomNameSet; }
页面代码修改
<select id="dropdownRoom"> <option value="0">Select Room</option> </select> <script> window.onload = function() { // 路径中的[YourControllerName]替换为你实际的控制器名称,比如HomeController就写/Home/GetRooms fetch('/[YourControllerName]/GetRooms') .then(res => res.json()) .then(rooms => { const dropdown = document.getElementById('dropdownRoom'); rooms.forEach(roomName => { const option = document.createElement('option'); option.value = roomName; option.innerText = roomName; dropdown.appendChild(option); }); }) } </script>
方案2:服务端渲染调用Action
该方式在页面渲染时就直接生成下拉选项,没有加载延迟,适合选项固定的场景。
控制器新增分部视图Action
public IActionResult RoomDropdownPartial() { var rooms = getRooms(_context.RmRooms); return PartialView(rooms); }
新增分部视图RoomDropdownPartial.cshtml
@model SortedSet<string> <select id="dropdownRoom"> <option value="0">Select Room</option> @foreach (var room in Model) { <option value="@room">@room</option> } </select>
Index页面直接调用渲染
<!-- 替换[YourControllerName]为实际控制器名 --> @await Html.ActionAsync("RoomDropdownPartial", "[YourControllerName]")
内容的提问来源于stack exchange,提问作者user4912134
相关产品推荐
相关产品推荐

