ASP.NET Core模型绑定值为Null求助:传递BlogData对象失败
问题原因及解决办法
为什么绑定失败?
ASP.NET Core的asp-route-*标签助手无法直接将BlogData这类复杂对象序列化为URL参数传递给HttpGet方法。它只会调用对象的ToString()方法,把返回的字符串作为参数值传递,而控制器的模型绑定无法将这个字符串解析为完整的BlogData对象,最终得到的就是属性全为默认值的空对象。
推荐解决方案:传递主键ID(最优方案)
这是ASP.NET中跳转详情页的标准做法,既安全又高效:
- 修改控制器方法,接收主键参数而非整个对象:
[HttpGet] public IActionResult DetailedView(int id) { // 根据id从数据库/缓存等数据源获取完整的BlogData对象 var blogItem = _blogRepository.GetById(id); if (blogItem == null) { return NotFound(); } return View(blogItem); } - 视图中修改
a标签,传递主键ID:<a class="read-more" asp-action="DetailedView" asp-route-id="@item.Id">阅读更多</a>
备选方案:逐个传递对象属性(不推荐)
如果必须传递对象的多个属性而非仅ID,可以逐个指定路由参数,让模型绑定自动映射到BlogData的属性:
- 视图中的
a标签:<a class="read-more" asp-action="DetailedView" asp-route-id="@item.Id" asp-route-title="@item.Title" asp-route-content="@item.Content" <!-- 其他需要传递的属性 --> >阅读更多</a> - 保持控制器方法参数为
BlogData blogItem,模型绑定会自动将URL中的参数对应到对象的同名属性。
注意:这种方式会让URL变得冗长,且敏感数据会暴露在URL中,仅适用于属性少且无敏感信息的场景。
特殊场景:使用Post请求传递复杂对象
如果对象属性过多或包含敏感数据,可以改用Post请求:
- 将
a标签替换为表单提交:<form asp-action="DetailedView" method="post"> <input type="hidden" name="Id" value="@item.Id" /> <input type="hidden" name="Title" value="@item.Title" /> <!-- 其他属性的隐藏输入 --> <button type="submit" class="read-more">阅读更多</button> </form> - 修改控制器方法为
[HttpPost]:[HttpPost] public IActionResult DetailedView(BlogData blogItem) { // 处理逻辑 return View(blogItem); }
内容的提问来源于stack exchange,提问作者nikhil
相关产品推荐
相关产品推荐

