如何将对象列表作为IHttpActionResult返回?

11

我是ASP.NET WebAPI的新手,我找不到一种通过id查询对象列表的方法。

这是我的GET请求的控制器方法。我想返回所有具有通过URL传递的指定questionnaireId的问题。

我尝试了这个:

// GET: api/Questions/5
[ResponseType(typeof(List<Question>))]
public Task<IHttpActionResult> GetQuestion(int questionnaireId)
{
    var questions = from q in db.Questions
    where q.QuestionnaireId == questionnaireId
    select new Question()
    {
            Id = q.Id,
            ImageLink = q.ImageLink,
            QuestionnaireId = q.QuestionnaireId,
            Text = q.Text
    };
    return questions;
}

这是我的Question类:

public class Question
    {
        public int Id { get; set; }

        [ForeignKey("Questionnaire")]
        public int QuestionnaireId { get; set; }

        public string Text { get; set; }
        public string ImageLink { get; set; }

        public virtual Questionnaire Questionnaire { get; set; }
    }

但是在返回问题时,编译器显示错误:

无法隐式转换类型System.Linq.IQueryable<finah_backend.Models.Question>System.Web.Http.IHttpActionResult。存在显式转换(您是否缺少强制转换?)

我想要通过查询问卷ID返回一个问题列表,并以JSON格式返回。问卷ID通过URL传递,例如api/questions/2==>将返回所有问卷ID为2的问题。


1
你遇到了什么错误或异常吗?我认为你的方法 GetQuestion 无法编译,因为返回类型与实际返回值不匹配。 - Jenish Rabadiya
无法隐式转换类型'System.Linq.IQueryable<finah_backend.Models.Question>'为'System.Web.Http.IHttpActionResult'。存在一个显式转换(是否缺少一个强制转换?) - Rick
4个回答

12
您正在使用[ResponseType]属性,但那只是用于生成文档,请参阅MSDN: ResponseTypeAttribute 类

当声明的返回类型为HttpResponseMessage或IHttpActionResult时,使用此方法来指定操作返回的实体类型。 ApiExplorer在生成ApiDescription时将读取ResponseType。

您可以更改返回类型并删除该属性,因为该返回类型文档将从实际签名生成:

public IEnumerable<Question> GetQuestion(int questionnaireId)

或者,如果您希望它是异步的:

public async Task<IEnumerable<Question>> GetQuestion(int questionnaireId)

或者将结果包装在IHttpActionResult中,该方法Request.CreateResponse<T>()可以实现:

 return Request.CreateResponse<IEnumerable<Question>>(HttpStatusCode.OK, questions);

如果您调用ApiController.Ok()方法,则后者会为您执行此操作:

return Ok(questions);

我将返回类型更改为public Task<IEnumerable<Question>> GetQuestion(int questionnaireId),但仍然出现错误:无法隐式转换类型System.Linq.IQueryable <finah_backend.Models.Question>至'System.Web.Http.IHttpActionResult'。存在显式转换(是否缺少转换?) - Rick
@Fairbreath 看一下修改内容。您混淆了语法。请使用public IEnumerable<>或者public async Task<IEnumerable<>> - CodeCaster
为什么你会将这个方法设为异步的,它并没有等待任何东西。这些答案都不起作用。 - Yusha

6

只需简单地像这样返回它,您需要使用ApiController现在提供的一种方法之一。

这将返回一个状态代码为200以及您的问题收集。

[ResponseType(typeof(List<Question>))]
public async Task<IHttpActionResult> GetQuestion(int questionnaireId)
{
    var questions = from q in db.Questions
    where q.QuestionnaireId == questionnaireId
    select new Question()
    {
            Id = q.Id,
            ImageLink = q.ImageLink,
            QuestionnaireId = q.QuestionnaireId,
            Text = q.Text
    };
    return this.Ok(questions);
}

2
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - CodeCaster
1
是的,当试图解决编译器错误时,另一个编译器错误并不能提供帮助。您还可以在答案中指出添加的 async - CodeCaster
@Fairbreath .. 这听起来像完全不同的问题?请就此提出一个单独的问题。 - BenjaminPaul
@Fairbreath 这与错误“无法隐式转换类型System.Linq.IQueryable<finah_backend.Models.Question>到System.Web.Http.IHttpActionResult。存在显式转换(您是否缺少转换?)”无关,这是我的答案解决的问题。 - BenjaminPaul
请编辑您的问题,不清楚您在问什么。 - BenjaminPaul

1

首先,不要直接使用实体来提供数据。为您的实体创建一个DTO:

public class QuestionDto
{

  public int id {get; set;}
  //put here getter and setter for all other Question attributes you want to have

  public QuestionDto(Question question){
    this.id = question.id;
    ... and so on
  }
}

那么你的GET方法可能是这样的:
// GET: api/Questions/5
public List<QuestionDto> GetQuestion(int questionnaireId)
{
    IEnumerable<QuestionDto> questions = from q in db.Questions
    where q.QuestionnaireId == questionnaireId
    select new QuestionDto(q);
    return questions.toList();
}

我也建议使用JSON进行数据传输,因为它与Javascript的结合非常容易。


1
哦,忘了这个吧,只需将您的答案包装在HttpResponseMessage中即可。 返回Request.CreateResponse(HttpStatusCode.OK, 要返回的对象); - Jazjef

0

我认为您正在寻找类似于以下代码:

public IEnumerable<Question> Get(int id)
    {
        //Create the list that you need to return here
        // I am creating a new list and adding an object below just for 
        // explaining the idea.

        var questions = new List<Question>();
        questions.Add(new Question());
        return questions;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接