问题
当PatientController.cs文件中这么写的时候,会报ambiguous xxx的错误:
[ApiController]
[Route("[Controller]")]
public class PatientController:ControllerBase
{
private readonly PatientDbContext _patientDbContext;
public PatientController(PatientDbContext patientDbContext)
{
_patientDbContext = patientDbContext;
}
[HttpGet]
public List<Patient> list(string keyword, int pageIndex, int pageSize) // 在Patient路由下面
{
var skip=pageSize*(pageIndex-1);
var patient = _patientDbContext.Patients
.Where(it=>it.Name.Contains(keyword))
.Skip(skip)
.Take(pageSize)
.ToList();
return patient;
}
public Patient GetDetail(int id) // 没有特别说明,默认跟随上面,在Patient这个路由下面
{
return _patientDbContext.Patients.Find(id);
}
public Patient Add(Patient patient) // 没有特别说明,默认跟随上面,在Patient这个路由下面
{
_patientDbContext.Add(patient);
_patientDbContext.SaveChanges();
return patient;
}
……
……
原因
在Asp.net WebApi控制器中,在同一个路由下面使用多个Post/Get等( [HttpGet] )请求报错。
因为一个控制器下面只能有一个HttpGet或其他请求,如果想要实现多个请求,我们需要去自定义路由(即标明路由是什么,之后通过每个方法不同的路由去访问请求)。
解决办法
在每个方法上面添加自定义路由,如下面代码所示:
[ApiController]
[Route("api/patient")] // [Route("[Controller]")] 这两个都可以
public class PatientController:ControllerBase
{
private readonly PatientDbContext _patientDbContext;
public PatientController(PatientDbContext patientDbContext)
{
_patientDbContext = patientDbContext;
}
[Route("pat0")]
[HttpGet]
// [HttpGet("pat0")] 上面这两行和这句话可以互换,都可以用
public List<Patient> list(string keyword, int pageIndex, int pageSize)
{
var skip=pageSize*(pageIndex-1);
var patient = _patientDbContext.Patients
.Where(it=>it.Name.Contains(keyword))
.Skip(skip)
.Take(pageSize)
.ToList();
return patient;
}
[Route("pat1")]
[HttpGet]
public Patient GetDetail(int id)
{
return _patientDbContext.Patients.Find(id);
}
······
······