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

ASP.NET Core模型绑定值为Null求助:传递BlogData对象失败

问题原因及解决办法

为什么绑定失败?

ASP.NET Core的asp-route-*标签助手无法直接将BlogData这类复杂对象序列化为URL参数传递给HttpGet方法。它只会调用对象的ToString()方法,把返回的字符串作为参数值传递,而控制器的模型绑定无法将这个字符串解析为完整的BlogData对象,最终得到的就是属性全为默认值的空对象。

推荐解决方案:传递主键ID(最优方案)

这是ASP.NET中跳转详情页的标准做法,既安全又高效:

  1. 修改控制器方法,接收主键参数而非整个对象:
    [HttpGet]
    public IActionResult DetailedView(int id)
    {
        // 根据id从数据库/缓存等数据源获取完整的BlogData对象
        var blogItem = _blogRepository.GetById(id);
        if (blogItem == null)
        {
            return NotFound();
        }
        return View(blogItem);
    }
    
  2. 视图中修改a标签,传递主键ID:
    <a class="read-more" asp-action="DetailedView" asp-route-id="@item.Id">阅读更多</a>
    

备选方案:逐个传递对象属性(不推荐)

如果必须传递对象的多个属性而非仅ID,可以逐个指定路由参数,让模型绑定自动映射到BlogData的属性:

  1. 视图中的a标签:
    <a class="read-more" asp-action="DetailedView" 
       asp-route-id="@item.Id" 
       asp-route-title="@item.Title" 
       asp-route-content="@item.Content"
       <!-- 其他需要传递的属性 -->
       >阅读更多</a>
    
  2. 保持控制器方法参数为BlogData blogItem,模型绑定会自动将URL中的参数对应到对象的同名属性。

注意:这种方式会让URL变得冗长,且敏感数据会暴露在URL中,仅适用于属性少且无敏感信息的场景。

特殊场景:使用Post请求传递复杂对象

如果对象属性过多或包含敏感数据,可以改用Post请求:

  1. 将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>
    
  2. 修改控制器方法为[HttpPost]:
    [HttpPost]
    public IActionResult DetailedView(BlogData blogItem)
    {
        // 处理逻辑
        return View(blogItem);
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:10:42