ASP.NET表单提交无法获取FoodSelectedId问题求助
问题排查与解决方案
核心问题是视图表单控件的绑定字段与ViewModel目标字段不匹配,导致提交后无法正确映射FoodSelectedId值,具体修正步骤如下:
1. 修正视图中的Select控件绑定
你的ViewModel中用于接收选中菜品ID的字段是FoodSelectedId,但视图里的select控件绑定的是不存在的FoodId字段,同时还有一个多余的FoodId隐藏输入框,这会导致表单提交时,数据无法映射到FoodSelectedId。
修改视图代码如下:
<form asp-controller="Chef" asp-action="CreateNewChefFood" method="post" enctype="multipart/form-data"> <input type="hidden" asp-for="ChefId" /> <!-- 移除多余的 <input type="hidden" asp-for="FoodId" /> --> <div class="form-row"> <div class="col-lg-8"> <div class="basic-form"> <div class="form-group"> <label asp-for="FoodSelectedId">Select Food from list:</label> <!-- 将asp-for改为FoodSelectedId,无需手动写name属性,asp-for会自动生成正确的name --> <select asp-for="FoodSelectedId" class="form-control"> @if (foodList.Any()) { @foreach (var item in foodList) { <option value="@item.FoodId"> @item.FoodTitle </option> } } </select> <!-- 修正验证提示的绑定字段 --> <span asp-validation-for="FoodSelectedId"></span> </div> </div> </div> </div> </form>
2. 完善HttpGet方法的ViewModel初始化
当前HttpGet方法没有将传入的id(ChefId)赋值给ViewModel,导致隐藏的ChefId输入框可能没有值,后续业务逻辑也会受影响,需要修正Get方法:
[HttpGet] [Route("CreateNewChefFood")] public async Task<IActionResult> CreateNewChefFood(int id) { if (id <= 0) return NotFound(); await GetAllFoodList(); await GetAllFoodPriceType(); // 初始化ViewModel并赋值ChefId var viewModel = new CreateChefFoodViewModel { ChefId = id }; return View(viewModel); }
3. 验证ModelState错误
如果修正后仍有问题,可以在Post方法中打印ModelState的错误信息,排查是否有其他绑定问题:
[HttpPost] [Route("CreateNewChefFood")] public async Task<IActionResult> CreateNewChefFood(CreateChefFoodViewModel createChefFoodViewModel) { // 打印所有ModelState错误,用于排查 if (!ModelState.IsValid) { var errors = ModelState.SelectMany(x => x.Value.Errors.Select(e => e.ErrorMessage)); foreach(var error in errors) { Console.WriteLine(error); } } // 后续原有逻辑... }
以上修正完成后,表单提交时选中的菜品ID会正确映射到CreateChefFoodViewModel的FoodSelectedId字段中。
内容的提问来源于stack exchange,提问作者Maryam12 forex
相关产品推荐
相关产品推荐

