我有一个像这样的控制器
[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.Get
和MessageToDoctorList.Get
返回不同类型的列表,请说InboxPatientModel
和InboxDoctorModel
。
是否可以使用[ResponseType(...)]
修饰操作,以便它可以是动态的,并且可以返回不同类型的列表?
答案 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。