如何从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);
}
答案 0 :(得分:3)
构造控制器类时未设置HttpContext,但稍后由ControllerBuilder类设置(“注入”)。 根据这个我可以通过覆盖“Initialize”方法来访问HttpContext。 This page explains ASP.NET MVC request flow
protected override void Initialize(HttpControllerContext controllerContext)
{
base.Initialize(controllerContext);
}
答案 1 :(得分:1)
您无法从构造函数中读取路径参数...仅从操作方法中读取。您需要使用预期模板定义适当的路径。在WebApiConfig.cs
中查看路由配置中的默认控制器也无法从控制器构造函数中访问HttpContext。
答案 2 :(得分:0)
你不能。要在动作方法中读取参数值,有几种方法。让我们假设一个代表一个人的模型。
public class Person
{
public Guid Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
现在让我们假设我们有一个API方法,使我们能够将一个人的表示发送到服务器,然后将其保存到某个数据存储。为此,我们实现了一个POST方法,该方法接受参数来构建我们的person对象。我们有几种方法可以做到这一点。
方法1:从请求正文中绑定参数
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"
}
方法2:从请求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
方法3:显式传递参数并自己创建对象
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
但是在上面提到的最后一种情况下,你必须明确地将参数绑定到你的模型。