You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让ASP.NET Core中SelectList仅显示单个选项并解决报错

解决方案:ASP.NET Core MVC 固定游戏的评论表单实现

1. 游戏卡片添加跳转链接

在游戏列表视图的卡片中,添加带GameId参数的跳转链接,确保点击时把目标游戏ID传给评论表单:

<!-- 游戏卡片中的“添加评论”链接 -->
<a asp-action="Create" asp-controller="Reviews" asp-route-gameId="@game.Id" class="btn btn-primary">添加评论</a>

2. 修改ReviewsController的Create GET方法

接收gameId参数,预填充用户邮箱、锁定游戏信息,无需用SelectList处理GameId(避免报错和不必要的下拉选择):

public async Task<IActionResult> Create(int gameId)
{
    // 从数据库获取目标游戏
    var game = await _context.Games.FindAsync(gameId);
    if (game == null)
    {
        return NotFound();
    }

    // 构建评论模型,预填充数据
    var reviewModel = new Review
    {
        GameId = gameId,
        UserEmail = User.Identity.Name, // Identity登录后,用户名默认是注册邮箱
        Rating = 5 // 默认设置5分
    };

    // 把游戏信息传到视图(用于显示)
    ViewData["GameName"] = game.Name;
    return View(reviewModel);
}

3. 调整评论表单视图(Create.cshtml)

去掉GameId的下拉选择,改用隐藏字段存储GameId,禁用的输入框显示游戏名称和用户邮箱,确保用户无法修改:

@model Review

<h1>添加评论</h1>

<div class="row">
    <div class="col-md-4">
        <form asp-action="Create">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            
            <!-- 隐藏字段存储GameId,确保提交时能正确传递 -->
            <input type="hidden" asp-for="GameId" />

            <!-- 显示游戏名称,禁用编辑 -->
            <div class="form-group">
                <label class="control-label">游戏名称</label>
                <input type="text" class="form-control" value="@ViewData["GameName"]" disabled />
            </div>

            <!-- 显示用户邮箱,禁用编辑 -->
            <div class="form-group">
                <label asp-for="UserEmail" class="control-label"></label>
                <input asp-for="UserEmail" class="form-control" disabled />
            </div>

            <!-- 五分制评分下拉,默认选中5分 -->
            <div class="form-group">
                <label asp-for="Rating" class="control-label"></label>
                <select asp-for="Rating" class="form-control">
                    <option value="1">1分</option>
                    <option value="2">2分</option>
                    <option value="3">3分</option>
                    <option value="4">4分</option>
                    <option value="5" selected>5分</option>
                </select>
                <span asp-validation-for="Rating" class="text-danger"></span>
            </div>

            <!-- 评论文本框 -->
            <div class="form-group">
                <label asp-for="CommentText" class="control-label"></label>
                <textarea asp-for="CommentText" class="form-control"></textarea>
                <span asp-validation-for="CommentText" class="text-danger"></span>
            </div>

            <div class="form-group">
                <input type="submit" value="提交评论" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

4. 完善Create POST方法

确保保存评论时验证GameId有效性,且关联正确的游戏:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,GameId,UserEmail,Rating,CommentText")] Review review)
{
    // 验证游戏是否存在
    if (!_context.Games.Any(g => g.Id == review.GameId))
    {
        ModelState.AddModelError("GameId", "无效的游戏ID");
        return View(review);
    }

    // 验证用户是否已登录(虽然Identity会拦截,但二次验证更安全)
    if (!User.Identity.IsAuthenticated)
    {
        return RedirectToAction("Login", "Account");
    }

    // 确保用户邮箱和登录用户一致
    if (review.UserEmail != User.Identity.Name)
    {
        ModelState.AddModelError("UserEmail", "无法修改用户邮箱");
        return View(review);
    }

    if (ModelState.IsValid)
    {
        _context.Add(review);
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
    }
    // 回显游戏名称到视图
    ViewData["GameName"] = _context.Games.Find(review.GameId)?.Name;
    return View(review);
}

之前报错的原因分析

你之前尝试用ViewData["GameId"]绑定SelectList并设置默认选中第5个选项,大概率是以下问题:

  • 数据库中第5个游戏的ID和传入的GameId不匹配,导致默认选中无效
  • 用disabled属性锁定下拉框时,表单提交时GameId不会被传递到后台,引发模型验证错误
  • SelectList的构造参数错误(比如未正确传递数据源、数据值字段、数据文本字段)

改用隐藏字段+禁用显示字段的方式,既满足“仅允许为选中游戏提交评论”的需求,又避免了下拉框带来的潜在错误。

内容的提问来源于stack exchange,提问作者Saif Romdhane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 06:35:51