ASP.NET Core 6 MVC:回发后维护下拉列表所选值

ASP.NET Core 6 MVC : maintain dropdownlist selected value after postback

提问人:Zafer Andaç Özer 提问时间:11/4/2023 最后编辑:marc_sZafer Andaç Özer 更新时间:11/5/2023 访问量:35

问:

我有一个下拉列表(也尝试过选择列表),它的项目来自 ViewBag。用户将选择一个项目,然后单击按钮以列出所选班级中的学生。

没关系,但是在回发下拉列表的选定值被重置后。

我希望列表中的选定元素保持不变。

(如果我在将代码中的功能名称翻译成英文时有任何不一致之处,请忽略。模型及其功能没有问题。所有插入、更新、删除操作都正常工作。我唯一的要求是下拉列表保留其选定的值。

视图

@model IEnumerable<Proje.Models.Student>

<form asp-action="Index" method="post" >
        
        @Html.DropDownList("groups", ViewBag.ListOfGroups,"Select...",new {@class="form-control"})
       
        <button type="submit" class="btn btn-sm btn-danger">
            List
        </button>
    </form>

控制器

public class StudentsController : Controller
{
    private readonly ApplicationDbContext _context;

    public StudentsController(ApplicationDbContext context)
    {
        _context = context;
    }
    
    public async Task<IActionResult> Index()
    {
        ViewBag.ListOfGroups = new SelectList(_context.Groups.OrderBy(k => k.Seviye).ThenBy(k => k.ShortName), "GroupId", "ShortName");
        var applicationDbContext = _context.Students.Where(k => k.Group.GroupId == 1).Include(s => s.Group).OrderBy(k => k.Group.Level).ThenBy(k => k.Group.ShortName).ThenBy(k => k.Number);
        return View(await applicationDbContext.ToListAsync());
    }
    
    [HttpPost]
    public async Task<IActionResult> Index(string groups)
    {
        int Id = Convert.ToInt32(groups);
        ViewBag.ListOfGroups = new SelectList(_context.Groups.OrderBy(k => k.Level).ThenBy(k => k.ShortName), "GroupId", "ShortName");
        var applicationDbContext = _context.Students.Where(k => k.Group.GroupId==Id).Include(s => s.Group).OrderBy(k => k.Group.Level).ThenBy(k => k.Group.ShortName).ThenBy(k => k.Number);
        return View(await applicationDbContext.ToListAsync());
    }
}

我在 StackOverflow 和互联网上搜索了太多,但找不到解决我的问题的方法,或者我不明白。

下拉菜单 asp.net-core-6.0 list.selectedvalue

评论


答:

0赞 BenderBoy 11/5/2023 #1

试试这个?

[HttpPost]
public async Task<IActionResult> Index(string groups)
{
    int id = Convert.ToInt32(groups);

    var students = await _context.Students
                                 .Where(k => k.Group.GroupId == id)
                                 .Include(s => s.Group)
                                 .OrderBy(k => k.Group.Level)
                                 .ThenBy(k => k.Group.ShortName)
                                 .ThenBy(k => k.Number)
                                 .ToListAsync();

    selectedGroup = students.FirstOrDefault()?.Group;

    var allGroups = _context.Groups
                            .OrderBy(k => k.Level)
                            .ThenBy(k => k.ShortName);
    
    ViewBag.ListOfGroups = new SelectList(allGroups, "GroupId", "ShortName", selectedGroup);

    return View(students);
}

唯一的区别是,我们将一个组传递给 。我正在使用学生来获取该组,因此仅当所选组中有任何学生时,这才有效。SelectList()