如何在asp.net web API 2中从控制器构造函数中读取参数值?

时间:2015-08-06 11:25:25

标签: c# web-services asp.net-web-api2

如何从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);
    }

3 个答案:

答案 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

但是在上面提到的最后一种情况下,你必须明确地将参数绑定到你的模型。