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

C# & ASP.NET Core MVC:网页抓取程序中Ajax向控制器传递值为Null的问题

问题原因分析

你遇到的这个问题是ASP.NET Core的模型绑定规则导致的:

  • 当你通过AJAX发送application/json格式的请求体时,ASP.NET Core默认不会将JSON中的键值对直接绑定到简单类型参数(比如string url)上。
  • 简单类型(string、int等)的默认绑定源是表单数据、路由参数、查询字符串,而不是请求体的JSON内容。
  • 另外你前端传递的JSON是{"url":"xxx"}这种对象结构,但后端用单个string参数接收,即使加上绑定特性,结构也不匹配,所以会得到null。

解决方案

这里提供两种最常用的解决方式,你可以根据需求选择:

方案1:使用实体类接收JSON数据(推荐)

这种方式更符合RESTful规范,也方便后续扩展参数:

步骤1:创建请求模型类

在项目中添加一个简单的类,用来对应前端传递的JSON结构:

public class UrlRequestModel
{
    // 属性名要和前端JSON的键名完全一致(大小写敏感,也可以用[JsonPropertyName]调整大小写匹配)
    public string Url { get; set; }
}

步骤2:修改控制器方法

用这个实体类作为参数,并加上[FromBody]特性(告诉框架从请求体中绑定数据):

[HttpPost]
public string GetUrlSource([FromBody] UrlRequestModel request)
{
    // 先判断请求是否为空
    if (request == null || string.IsNullOrWhiteSpace(request.Url))
    {
        return string.Empty;
    }
    
    string url = request.Url;
    // 用StartsWith判断更稳妥,避免URL长度不足4时抛出异常
    url = url.StartsWith("http") ? url : "http://" + url; 
    string htmlCode = "";
    using (WebClient client = new WebClient())
    {
        try
        {
            htmlCode = client.DownloadString(url);
        }
        catch (Exception ex)
        {
            // 建议这里添加异常日志,方便后续排查抓取失败的原因
            // Console.WriteLine($"抓取失败:{ex.Message}");
        }
    }
    return htmlCode;
}

前端代码无需修改

你当前的AJAX代码传递的{"url":"xxx"}和实体类的结构匹配,所以不需要改动前端。


方案2:调整前后端,直接绑定字符串

如果你不想创建实体类,可以调整前后端的参数传递方式:

步骤1:修改前端AJAX的data

把传递的JSON改成单纯的字符串(而不是对象):

$.ajax({
    type: "POST",
    url: "/Home/GetUrlSource",
    contentType: "application/json; charset=utf-8",
    data: JSON.stringify(urlValue), // 直接序列化输入的URL字符串
    dataType: "html",
    // 其他回调函数保持不变
});

步骤2:修改控制器方法

给string参数加上[FromBody]特性:

[HttpPost]
public string GetUrlSource([FromBody] string url)
{
    if (string.IsNullOrWhiteSpace(url))
    {
        return string.Empty;
    }
    
    url = url.StartsWith("http") ? url : "http://" + url;
    // 后续抓取代码保持不变
}

额外提示

  • 你原来的url.Substring(0, 4) != "http"存在风险:如果用户输入的URL长度小于4,会直接抛出异常,改用StartsWith更安全。
  • 尽量不要空着catch块,添加简单的日志输出能帮你快速定位网页抓取失败的具体原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 18:37:35