asp.net

在C# webapi中的 [FromBody] [FromForm]的区别

2025-08-22

在C# Web API中,[FromBody]和[FromForm]是用于指定模型绑定来源的属性。它们的主要区别在于它们处理请求体的方式以及它们通常与哪种类型的HTTP请求一起使用。

1、[FromBody]属性告诉模型绑定器从请求正文中获取数据。它通常用于处理JSON或XML格式的请求体,这在RESTful API中是非常常见的。当客户端发送一个POST、PUT或PATCH请求时,它通常会在请求体中包含数据,这时可以使用[FromBody]属性。

示例

假设你有一个简单的模型:

public class MyModel 

 {  
      public string Name { get; set; }  
      public int Age { get; set; } 

 }

你可以在一个API控制器中使用[FromBody]来接收这个模型的实例:

[HttpPost]  

public IActionResult Create([FromBody] MyModel model) 

{  
      if (model == null)  
      {  
          return BadRequest();  
      }  
 
      // 处理模型数据...  
     return Ok(); 

}

在这个例子中,客户端需要发送一个包含Name和Age字段的JSON对象作为请求体。例如:

{  
   "Name": "John Doe",  
   "Age": 30  

}

2、[FromForm]

[FromForm]属性用于处理表单数据,通常与multipart/form-data或application/x-www-form-urlencoded类型的请求一起使用。这在处理文件上传或简单的表单提交时非常有用。

示例

假设你有一个简单的模型,用于接收表单数据:

public class FormDataModel  

{  

    public string Username { get; set; }  

    public IFormFile File { get; set; } // 用于文件上传  

}

你可以在一个API控制器中使用[FromForm]来接收这个模型的实例:


[HttpPost("upload")]  

public IActionResult UploadFile([FromForm] FormDataModel formData)  

{  

    if (formData.File == null || formData.File.Length == 0)  

    {  

        return BadRequest("Please upload a file.");  

    }  

  

    // 处理上传的文件和表单数据...  

    return Ok();  

}

在这个例子中,客户端需要发送一个multipart/form-data类型的POST请求,其中包含Username字段和一个文件。例如,使用HTML表单或某些HTTP客户端库可以构造这样的请求。

总结

[FromBody]通常用于处理JSON或XML格式的请求体,这在RESTful API中很常见。

[FromForm]通常用于处理表单数据,特别是当涉及到文件上传时。

在选择使用哪一个属性时,主要取决于你的API预期接收的请求类型和内容格式。