在开发Web应用程序时,经常需要处理客户端请求并返回数据。在ASP.NET MVC框架中,通常使用控制器来处理这些请求。然而,随着JavaScript框架和移动设备的普及,越来越需要以JSON格式返回数据。这时,API控制器就显得尤为重要。API控制器与MVC控制器的主要区别在于,API控制器专门用于返回数据,而MVC控制器则返回视图。这意味着,如果应用程序需要与JavaScript框架交互,或者需要提供RESTful API,那么使用API控制器将更加合适。
首先,让了解一下如何在现有的MVC应用程序中添加API控制器。如果从头开始创建一个新的项目,可以选择创建一个Web API项目。但是,如果已经有一个正在运行的MVC项目,可以按照以下步骤添加API控制器:
下面是一个WebApiConfig类的示例:
public static class WebApiConfig
{
public static void Register(HttpConfiguration configuration)
{
configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
configuration.Routes.MapHttpRoute(
"DefaultApi",
"api/{controller}/{id}",
new { id = RouteParameter.Optional }
);
}
}
接下来,需要修改Global.asax.cs文件,以确保Web API配置首先被注册。可以通过添加以下代码来实现这一点:
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
// 其他配置代码...
}
现在,可以创建一个API控制器并使用它了。下面是一个简单的BrandController示例:
public class BrandController : ApiController
{
// GET api/brand
public IEnumerable Get()
{
return new string[] { "value1", "value2" };
}
// GET api/brand/5
public string Get(int id)
{
return "value";
}
// POST api/brand
public void Post([FromBody]string value)
{
}
// PUT api/brand/5
public void Put(int id, [FromBody]string value)
{
}
// DELETE api/brand/5
public void Delete(int id)
{
}
}
现在,已经准备好测试API控制器了。例如,可以调用Get(int id)方法来获取一个特定的品牌信息,或者调用Get方法来获取所有品牌信息。如果注意到返回的数据是XML格式的,而希望返回JSON格式的数据,只需要在WebApiConfig类中添加以下代码行:
configuration.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
这样,WebApiConfig类应该看起来像这样:
public static void Register(HttpConfiguration configuration)
{
configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
configuration.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
configuration.Routes.MapHttpRoute(
"DefaultApi",
"Api/{controller}/{id}",
new { id = RouteParameter.Optional }
);
}
// GET Api/brand
public IEnumerable Get()
{
var result = brandQuery.GetAll();
return result;
}
// GET Api/brand/5
public BrandViewModel Get(int id)
{
var result = brandQuery.Get(id);
return result;
}