无法更新Question实体中的枚举属性问题排查
问题:更新Question实体枚举属性时遇标记助手错误
错误提示:
标记助手‘option’不得在元素的属性声明区域包含C#代码。
相关代码
Question.cs
using quiz.Entities; using System.ComponentModel; public class Question { public Guid Id { get; set; } [DisplayName("Question's Text")] public string QuestionText { get; set; } public enum DifficultyLevel { Easy, Medium, Hard } [DisplayName("Zorluk Derecesi")] public DifficultyLevel Difficulty { get; set; } [DisplayName("Şık A")] public string AnswerA { get; set; } [DisplayName("Şık B")] public string AnswerB { get; set; } [DisplayName("Şık C")] public string AnswerC { get; set; } [DisplayName("Şık D")] public string AnswerD { get; set; } [DisplayName("Doğru Şık")] public char CorrectAnswer { get; set; } [DisplayName("Movie Name (MovieId)")] public Guid MovieId { get; set; } public virtual Movie? Movie { get; set; } }
Edit.cshtml
<div class="form-group mb-4"> <label asp-for="Difficulty" class="form-label font-weight-bold">Zorluk Derecesi</label> <select asp-for="Difficulty" class="form-control bg-secondary text-light border-0 shadow-sm"> <option value="">Seçiniz</option> @foreach (var level in Enum.GetValues(typeof(Question.DifficultyLevel))) { <option value="@level.ToString()" @(Model.Difficulty == level ? "selected" : "")>@level</option> } </select> <span asp-validation-for="Difficulty" class="text-danger"></span>
解决方案
错误根源是ASP.NET Core的option标记助手不允许在属性声明区域直接嵌入C#代码(此处的三元表达式属于属性内的C#逻辑),提供两种解决办法:
方法一:使用枚举绑定标记助手(推荐)
ASP.NET Core内置了枚举下拉框的快捷绑定方式,无需手动循环,自动处理选中状态:
<div class="form-group mb-4"> <label asp-for="Difficulty" class="form-label font-weight-bold">Zorluk Derecesi</label> <select asp-for="Difficulty" asp-items="Html.GetEnumSelectList<Question.DifficultyLevel>()" class="form-control bg-secondary text-light border-0 shadow-sm"> <option value="">Seçiniz</option> </select> <span asp-validation-for="Difficulty" class="text-danger"></span> </div>
Html.GetEnumSelectList会自动生成枚举所有选项,并匹配当前Model.Difficulty的值设置selected属性。
方法二:手动循环时拆分逻辑
如果坚持手动构建选项,可将选中状态提前赋值给变量,避免在属性内直接写C#代码:
<div class="form-group mb-4"> <label asp-for="Difficulty" class="form-label font-weight-bold">Zorluk Derecesi</label> <select asp-for="Difficulty" class="form-control bg-secondary text-light border-0 shadow-sm"> <option value="">Seçiniz</option> @foreach (var level in Enum.GetValues(typeof(Question.DifficultyLevel))) { string selected = Model.Difficulty == level ? "selected" : ""; <option value="@level.ToString()" @selected>@level</option> } </select> <span asp-validation-for="Difficulty" class="text-danger"></span> </div>
内容的提问来源于stack exchange,提问作者onurkaygn
相关产品推荐
相关产品推荐

