首页 > 解决方案 > 如何使用 ASP.NET Core Razor 页面预选下拉列表中的项目

问题描述

如果有帮助,我们正在使用 ASP.NET Core 2.1 和 Razor 页面(不是传统的 MVC)

我在选择工作时遇到问题。我们正在使用引入枚举的列表为我们的页面生成一个选项列表SelectListItem,并将其放置在我们的 asp-items 中,效果非常好。对于我们的 asp-for,我们使用了一个递增的标签,因为有几个下拉菜单的循环。

<select asp-for="@Model.Answers[answerOptionIndex].AnswerText" 
        asp-items="@Model.CriticalIllnessTierSelectListItems" 
        class="form-control">
    <option></option>
</select>

对于添加产品,这非常有用,asp-for 生成Answers[0].AnswerText名称和Answers_0__AnswerTextID,这非常棒。

问题是我们需要能够编辑现有表单,因此为了预先填充值,我发现您可以使用 asp-for,所以我输入了@answerTextForQuestionfor asp-for,现在在页面加载时预先选择了正确的选项。 ..但随后它弄乱了我的ID和名称。

当我这样做时,我得到了这个:

<select name="answerTextForQuestion" class="form-control" 
        id="answerTextForQuestion">

奇怪的是它没有放值answerTextForQuestion,它只是放了变量。

我尝试手动设置名称和 ID@Model.Answers[answerOptionIndex].AnswerText并保留asp-foras@answerTextForQuestion但它忽略它并仍然 @answerTextForQuestion输入问题和答案。

我不知道我的蛋糕怎么吃。我需要我的 asp-for,@Model.Answers[answerOptionIndex].AnswerText但我也需要它来选择任何值@answerTextForQuestion。因为我们正在使用SelectListItem我不能只在正确的属性上抛出一个选定的属性。

我发现了一个堆栈溢出,它试图使用一个循环,如果选中的项目匹配,answerTextForQuestion则使选中的属性为真,但这不起作用,我在评论中读到选中的是只读的,所以这不起作用。我将其加粗是因为我担心它会因为重复帖子而被否决。

编辑:一个更好的标题可能是我可以使用另一个属性来告诉浏览器应该在不使用 ASP-FOR 的情况下预先选择哪个选项。我们有很多围绕 ASP-FOR 使用的名称和 ID 构建的 AJAX,但我只需要这个函数。我查看了 C# 文档,但什么也没看到。

标签: c#asp.net-core.net-corerazor-pages

解决方案


对于下拉列表中的预选项目,您可以参考部分代码的简单示例,如下所示

1.在Edit.cshtml中

<div class="form-group">
            <label asp-for="Movie.Genre" class="control-label"></label>
            <select  asp-for="Movie.Genre.Id" asp-items='(List<SelectListItem>)ViewData["Genres"]'></select>
        </div>

2.在编辑.cshtml.cs

模型绑定

[BindProperty]
    public Movie Movie { get; set; }

    public Genre Genre { get; set; }

OnGetAsync()

 Movie = await _context.Movie
                     .Include(m => m.Genre)
                     .SingleOrDefaultAsync(m => m.Id == id);

 ViewData["Genres"] = _context.Genre.Select(g => new SelectListItem { Value = g.Id.ToString(), Text = g.Name }).ToList();

推荐阅读