C# 如何在Web API v2中使用参数?

C# 如何在Web API v2中使用参数?,c#,asp.net-web-api,C#,Asp.net Web Api,我不知道从哪里开始。我之前问过一个问题,有人建议我看看属性路由。我仔细阅读了它,虽然它帮助我创建了下面的代码,但我仍然不知道如何像我想的那样限制它 public class ReviewController : ApiController { private Review db = new Review(); ////This GET works. It was auto-generated by Visual Studio. // GET: api/Review

我不知道从哪里开始。我之前问过一个问题,有人建议我看看属性路由。我仔细阅读了它,虽然它帮助我创建了下面的代码,但我仍然不知道如何像我想的那样限制它

public class ReviewController : ApiController
{
    private Review db = new Review();
    ////This GET works. It was auto-generated by Visual Studio. 
    // GET: api/Review
    public IQueryable<Review> GetReview()
    {
        return db.Review;
    }

    ////This is the GET that I'm trying to write, but don't know what to do
    // GET: api
    [Route("api/review/site")]
    [HttpGet]
    public IEnumerable<Review> FindStoreBySite(int SiteID)
    {
         return db.Review
    }

    ////This GET also works and was generated by VS. 
    // GET: api/Review/5
    [ResponseType(typeof(Review))]
    public IHttpActionResult GetReview(int id)
    {
        Review review = db.Review.Find(id);
        if (review == null)
        {
            return NotFound();
        }

        return Ok(review);
    }
下面是我得到的错误:

Multiple actions were found that match the request
当我用谷歌搜索它时,我会想到这个问题:

但是,我已经在那里尝试了答案(我已经确认我使用的是Web API V2,并且我的webapiconfig.cs文件包括
config.maphttpAttribute();
行)


此外,正如您在我上面的代码中所看到的,我已经包含了适当的路由。但是,我仍然收到一个错误,告诉我它返回了两个冲突的API调用。

如果您想获取get的参数,这就像一个简单的重载,但是如果完成了,POST将使用
[fromBody]
,因为URL位于标记
[路线(“/abc/123/{id}”)]

例子 代码

返回

  17
  17
或 返回

  17
  17

如果您想获取get的参数,这就像一个简单的重载,但是如果完成了,POST将使用
[fromBody]
,因为URL位于标记
[Route(“/abc/123/{id}”)]

例子 代码

返回

  17
  17
或 返回

  17
  17

要将参数传递给WebApi控制器,您需要向该控制器添加一个
[Route()]
属性,并用该
{}
标记用作属性的链接部分

要返回仅与传入参数匹配的审阅,需要使用LINQ筛选数据

以下是一个例子:

[Route("api/getFoo/{id}")]
public IHttpActionResult GetFoo(int id)
{
    return db.Foo.Where(x => x.Id == id);
}
字符串的
{id}
部分表示将出现在浏览器url中的id:
http://localhost:51361/api/getFoo/2
。url中的“2”是您在
[Route(“api/getFoo/{id}”)属性中标记的
{id}
属性

我还修改了您的代码:

public class ReviewController : ApiController
{
    ...


    [Route("api/review/site/{siteId}")]
    [HttpGet]
    public IEnumerable<Review> FindStoreBySite(int SiteID)
    {
         return db.Review.Where(review => review.Id == SiteID);
    }

    ...
公共类审阅控制器:ApiController
{
...
[路由(“api/review/site/{siteId}”)]
[HttpGet]
公共IEnumerable FindStoreBySite(int SiteID)
{
返回db.Review.Where(Review=>Review.Id==SiteID);
}
...
您的请求url应该如下所示:
http://localhost:51361/api/review/site?SiteID=2



一开始你很难理解这一点,但最终你会习惯的。这是参数传递给控制器动作参数的方式。

要将参数传递给WebApi控制器,你需要添加一个
[Route()]
属性,并用此
{}
标记用作属性的链接部分

要返回仅与传入参数匹配的审阅,需要使用LINQ筛选数据

以下是一个例子:

[Route("api/getFoo/{id}")]
public IHttpActionResult GetFoo(int id)
{
    return db.Foo.Where(x => x.Id == id);
}
字符串的
{id}
部分表示将出现在浏览器url中的id:
http://localhost:51361/api/getFoo/2
。url中的“2”是您在
[Route(“api/getFoo/{id}”)属性中标记的
{id}
属性

我还修改了您的代码:

public class ReviewController : ApiController
{
    ...


    [Route("api/review/site/{siteId}")]
    [HttpGet]
    public IEnumerable<Review> FindStoreBySite(int SiteID)
    {
         return db.Review.Where(review => review.Id == SiteID);
    }

    ...
公共类审阅控制器:ApiController
{
...
[路由(“api/review/site/{siteId}”)]
[HttpGet]
公共IEnumerable FindStoreBySite(int SiteID)
{
返回db.Review.Where(Review=>Review.Id==SiteID);
}
...
您的请求url应该如下所示:
http://localhost:51361/api/review/site?SiteID=2



一开始你很难理解这一点,但最终你会习惯的。这是参数如何传递给控制器操作参数的问题。

对不起,你的答案我不太清楚。我应该在你的代码中添加什么内容,以便它知道在
查看
控制器中查看
站点ID
匹配参数?抱歉,我不太清楚您的答案。我应该在您的代码中添加什么内容,以便它能够在
Review
控制器中查看
SiteID
与参数匹配的地方?是的,这正是我在示例代码中的内容。我只是不确定在
中会出现什么内容
{}
s。我有一个可以返回所有评论的API,还有一个可以根据评论ID限制评论的API。我正在努力让它根据
SiteID
而不是“key”返回所有评论来自模型类。@phroureo我更新了我的答案。基本上,你需要使用LINQ来指定你只需要
Id
属性等于传入的
siteId
属性的评论。你可以通过执行
db.reviews.Where(review=>review.Id==siteId)
谢谢!这就是我要找的。:)@Phrureo我很高兴听到这个消息。谢谢你的投票和选择的答案!好吧,我撒谎了。出于某种原因,
../api/review/site?id=1
返回了与
/api/review/1
相同的东西。它根本没有查看
siteID
。好的,这正是我在示例代码中的内容。我只是不确定你的
介于
{}
之间。我有一个可以返回所有评论的API,还有一个可以根据评论ID限制评论的API。我正在努力让它根据
SiteID
而不是“key”返回所有评论从模型类中。@phroureo我更新了我的答案。基本上,您需要使用LINQ来指定您只需要其
Id
属性等于传入的
siteId
属性的评论。您可以通过执行
db.reviews.Where(review=>review.Id==siteId)来实现这一点
谢谢!这就是我要找的。:@phroureo我很高兴听到这个消息。谢谢你的投票和选择的答案!好吧,我撒谎了。出于某种原因,
../api/review/site?id=1
返回的内容与
/api/review/1
相同。它没有查看