ASP.NET Web API 的模型绑定器无法将 JSON 转换为字符串,您必须使用对象来执行此操作。
所以你有 3 个选项来解决你的问题
首先,使用查询字符串
在您的操作中将属性FromBody 更改为FromUri,就像这样
public IEnumerable<string> Post([FromUri]string custName)
{
try
{
names.Add(custName);
return names;
}
catch (Exception ex)
{
return null;
}
}
然后更改您的 javascript 代码
$.post("/Api/Test/?custName=" + customerName, function(data) {
console.log(data);
}).error(function(e) {
console.log(e);
});
二、使用路由属性
使用类似的 Route 属性装饰您的操作
[Route("api/test/{custName}")]
public IEnumerable<string> Post([FromUri]string custName)
{
try
{
names.Add(custName);
return names;
}
catch (Exception ex)
{
return null;
}
}
然后更改您的 javascript 代码
$.post("/Api/Test/" + customerName, function(data) {
console.log(data);
}).error(function(e) {
console.log(e);
});
Obs.:要使用Route属性,你必须在WebApiConfig中配置它,所以你必须有这行:
config.MapHttpAttributeRoutes();
所以你的 WebApiConfig 应该是这样的
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
三、使用视图模型类
创建一个类
public class ViewModel
{
public string custName { get; set; }
}
使用 FromBody 属性在您的操作中接收此模型
public IEnumerable<string> Post([FromBody]ViewModel viewModel)
{
try
{
names.Add(viewModel.custName);
return names;
}
catch (Exception ex)
{
return null;
}
}
然后更改您的 javascript 代码
$.post("/Api/Test/", { custName: customerName }, function(data) {
console.log(data);
}).error(function(e) {
console.log(e);
});
Obs.: 你的控制器有一个小错误
public class TestController : ApiController
{
public List<string> names = new List<string>();
public string Get()
{
return "Hello I am Service";
}
//Rest of code
}
Web API 和 MVC 中的每个控制器都是在每次服务器处理请求时创建的,因此如果您想保留,TestController 类中的 names 字段将是每个请求中的一个新列表此列表中的数据其他请求,将其设为静态
public static List<string> names = new List<string>();