如何从WebAPI控制器操作返回不同类型的模型?

时间:2018-01-11 12:22:37

标签: c# asp.net-mvc asp.net-web-api

我有一个像这样的控制器

    [ResponseType(typeof(List<InboxPatientModel>))]
    [Route("~/api/Messages/search")]
    public IHttpActionResult GetSearch(string serchTerm = "", string messageFor = "p")
    {
        try
        {
            if(messageFor == "p")
            {
                var inboxMessages = MessageToPatientList.Get(serchTerm);
                return Ok(inboxMessages);
            }
            else
            {
                var outboxMessages = MessageToDoctorList.Get(serchTerm);
                return Ok(outboxMessages);
            }
        }
        catch (Exception ex)
        {
             //some code for exception handling....
        }
    }

此处MessageToPatientList.GetMessageToDoctorList.Get返回不同类型的列表,请说InboxPatientModelInboxDoctorModel

是否可以使用[ResponseType(...)]修饰操作,以便它可以是动态的,并且可以返回不同类型的列表?

4 个答案:

答案 0 :(得分:6)

您可以合并不同类型的列表;

public class PatientModel
{
    public List<InboxPatientModel> Patients { get; set; }

    public List<InboxDoctorModel> Doctors { get; set; }
}

[ResponseType(typeof(PatientModel))]
[Route("~/api/Messages/search")]
public IHttpActionResult GetSearch(string serchTerm = "", string messageFor = "p")
{
    try
    {
        var patientModel = new PatientModel();
        if (messageFor == "p")
        {
            var inboxMessages = MessageToPatientList.Get(serchTerm);
            patientModel.Patients = inboxMessages;
        }
        else
        {
            var outboxMessages = MessageToDoctorList.Get(serchTerm);
            patientModel.Doctors = inboxMessages;
        }
        return Ok(patientModel);
    }
    catch (Exception ex)
    {
        //some code for exception handling....
    }
}

答案 1 :(得分:3)

在搜索医生和患者时,URL已经不同了,因此单一操作没有任何好处。

只需写两个动作&#34; GetDoctors&#34;和&#34; GetPatients&#34;返回你想要的类型。

[ResponseType(typeof(List<InboxPatientModel>))]
[Route("~/api/Messages/searchpatients")]
public IHttpActionResult GetPatients(string searchTerm = "")
{
}

[ResponseType(typeof(List<InboxDoctorModel>))]
[Route("~/api/Messages/searchdoctors")]
public IHttpActionResult GetDoctors(string searchTerm = "")
{
}

答案 2 :(得分:3)

您的代码运行得很好。 [ResponseType]属性仅用于提供Web API文档页面和Swagger等工具的提示。

虽然该属性的AllowMultiple=true属性中包含AttributeUsage,但我认为这些文档工具不支持此功能。

他们不应该。从API中返回不同的类型,取决于月亮的大小,星期几或某些参数的值是一个地狱实现,一个地狱文件和一个地狱消费。

相反,请考虑检查设计。为什么邮件的实际类型会根据谁是收件人而发生变化?这两种消息的 有什么不同?

相反,找到他们分享的属性。然后提取一个基类,比如Message,并使用属性[ResponseType(typeof(Message))]修饰该方法。

答案 3 :(得分:1)

每个资源(患者和医生)都应该有自己的控制器操作。我会这样做:

1)创建两个不同的控制器动作:一个用于InboxPatientModel,另一个用于InboxDoctorModel。

2)在客户端,您根据&#34; messageFor&#34;确定需要调用的控制器操作。

3)Eeach控制器操作将具有不同的ResponseType。