如何从 asp.net web API 2 中的控制器构造函数读取参数值?
How I can read parameter value from controller constructor in asp.net web API 2?
如何从 asp.net web 中的控制器构造函数读取参数值 API 2 ??
public class DataController : ApiController
{
private APIMgr apiMgr ; // APIMgr custome class
public DataController()
{
// var id = Request.GetRouteData(); = 5 // this parameter must send with alla request "http://localhost/TAPI/api/data/5"
apiMgr= new apiMgr(id);
}
您不能从构造函数中读取路由参数...只能从操作方法中读取。您需要使用预期的模板定义适当的路线。查看 WebApiConfig.cs
中路由配置中的默认控制器
HttpContext 也不能从控制器构造函数中访问。
你不能。要读取操作方法中的参数值,有几种方法。让我们假设一个代表一个人的模型。
public class Person
{
public Guid Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
现在让我们假设我们有一个 API 方法,使我们能够将一个人的表示发送到服务器,然后服务器将其保存到某个数据存储中。为此,我们实现了一个 POST 方法,该方法接受参数来构建我们的 person 对象。有几种方法可以做到这一点。
方法一:从请求体中绑定参数
public IHttpActionResult Post([FromBody]Person person)
{
// validate your parameter in some way
if (person.Equals(default(Person))) return BadRequest("person must not be null");
// go off and save the person
var createdPerson = myPersonRepository.Save(person);
if (createdPerson == default(Person)) return InternalServerError();
return CreatedAtRoute("DefaultApi", new { id = createdPerson.Id }, createPerson);
}
这需要您在请求正文中传递 JSON 代表您的人。像下面这样的东西应该可以做到。
{
"firstname": "Luke",
"lastname": "Skywalker"
}
方法二:从请求URL查询字符串中绑定参数
public IHttpActionResult Post([FromUri]Person person)
{
// validate your parameter in some way
if (person.Equals(default(Person))) return BadRequest("person must not be null");
// go off and save the person
var createdPerson = myPersonRepository.Save(person);
if (createdPerson == default(Person)) return InternalServerError();
return CreatedAtRoute("DefaultApi", new { id = createdPerson.Id }, createPerson);
}
这需要您在查询字符串中传递参数值,例如:
http://mywhizzyapi/api/people?firstname=luke&lastname=skywalker
方法三:显式传参,自己创建对象
public IHttpActionResult Post(string firstname, string lastname)
{
// validate your parameter in some way
if (id.Equals(Guid.Empty)) return BadRequest("id must not be null or an empty GUID");
if (string.IsNullOrEmpty(firstname)) return BadRequest("firstname must not be null or empty");
if (string.IsNullOrEmpty(lastname)) return BadRequest("lastname must not be null or empty");
// create your person object
var person = New Person {
id = id,
firstName = firstname,
lastname = lastname,
};
// go off and save the person
var createdPerson = myPersonRepository.Save(person);
if (createdPerson == default(Person)) return InternalServerError();
return CreatedAtRoute("DefaultApi", new { id = createdPerson.Id }, createPerson);
}
此方法还需要您在查询字符串中传递参数值,例如:
http://mywhizzyapi/api/people?firstname=luke&lastname=skywalker
但在提到的最后一种情况下,您必须将参数显式绑定到您的模型。
构造控制器 class 时未设置 HttpContext,但稍后由 ControllerBuilder class 设置 ("injected")。
据此,我可以通过覆盖 "Initialize" 方法访问 HttpContext。
This page explains ASP.NET MVC request flow
protected override void Initialize(HttpControllerContext controllerContext)
{
base.Initialize(controllerContext);
}
如何从 asp.net web 中的控制器构造函数读取参数值 API 2 ??
public class DataController : ApiController
{
private APIMgr apiMgr ; // APIMgr custome class
public DataController()
{
// var id = Request.GetRouteData(); = 5 // this parameter must send with alla request "http://localhost/TAPI/api/data/5"
apiMgr= new apiMgr(id);
}
您不能从构造函数中读取路由参数...只能从操作方法中读取。您需要使用预期的模板定义适当的路线。查看 WebApiConfig.cs
中路由配置中的默认控制器HttpContext 也不能从控制器构造函数中访问。
你不能。要读取操作方法中的参数值,有几种方法。让我们假设一个代表一个人的模型。
public class Person
{
public Guid Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
现在让我们假设我们有一个 API 方法,使我们能够将一个人的表示发送到服务器,然后服务器将其保存到某个数据存储中。为此,我们实现了一个 POST 方法,该方法接受参数来构建我们的 person 对象。有几种方法可以做到这一点。
方法一:从请求体中绑定参数
public IHttpActionResult Post([FromBody]Person person)
{
// validate your parameter in some way
if (person.Equals(default(Person))) return BadRequest("person must not be null");
// go off and save the person
var createdPerson = myPersonRepository.Save(person);
if (createdPerson == default(Person)) return InternalServerError();
return CreatedAtRoute("DefaultApi", new { id = createdPerson.Id }, createPerson);
}
这需要您在请求正文中传递 JSON 代表您的人。像下面这样的东西应该可以做到。
{
"firstname": "Luke",
"lastname": "Skywalker"
}
方法二:从请求URL查询字符串中绑定参数
public IHttpActionResult Post([FromUri]Person person)
{
// validate your parameter in some way
if (person.Equals(default(Person))) return BadRequest("person must not be null");
// go off and save the person
var createdPerson = myPersonRepository.Save(person);
if (createdPerson == default(Person)) return InternalServerError();
return CreatedAtRoute("DefaultApi", new { id = createdPerson.Id }, createPerson);
}
这需要您在查询字符串中传递参数值,例如:
http://mywhizzyapi/api/people?firstname=luke&lastname=skywalker
方法三:显式传参,自己创建对象
public IHttpActionResult Post(string firstname, string lastname)
{
// validate your parameter in some way
if (id.Equals(Guid.Empty)) return BadRequest("id must not be null or an empty GUID");
if (string.IsNullOrEmpty(firstname)) return BadRequest("firstname must not be null or empty");
if (string.IsNullOrEmpty(lastname)) return BadRequest("lastname must not be null or empty");
// create your person object
var person = New Person {
id = id,
firstName = firstname,
lastname = lastname,
};
// go off and save the person
var createdPerson = myPersonRepository.Save(person);
if (createdPerson == default(Person)) return InternalServerError();
return CreatedAtRoute("DefaultApi", new { id = createdPerson.Id }, createPerson);
}
此方法还需要您在查询字符串中传递参数值,例如:
http://mywhizzyapi/api/people?firstname=luke&lastname=skywalker
但在提到的最后一种情况下,您必须将参数显式绑定到您的模型。
构造控制器 class 时未设置 HttpContext,但稍后由 ControllerBuilder class 设置 ("injected")。
据此,我可以通过覆盖 "Initialize" 方法访问 HttpContext。
This page explains ASP.NET MVC request flow
protected override void Initialize(HttpControllerContext controllerContext)
{
base.Initialize(controllerContext);
}