在带有WebApi的ASP.NET MVC 5中:
是否可以根据用于访问Action的路由从Controller的Action返回不同的对象类型?
我在WebApiConfig路由寄存器中有以下内容:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultApiAMX",
routeTemplate: "api/AMX/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
所以,这个想法是:
如果我选择“api /”路由,Action应该返回一个类型为“A”的对象,但是如果我选择“api / AMX”,它将返回类型“B”。
我知道有“RoutePrefix”或“Route”这样的属性,但这会迫使我实现两个动作,每个路径路径一个;类似的东西:
[RoutePrefix("api")]
public IHttpActionResult ActionA(){
return new A();
}
[RoutePrefix("api/AMX")]
public IHttpActionResult ActionB(){
return new B();
}
我想做的是检查Action内部的路径路径,以根据路径返回正确的类型。
为什么我要实现类似的东西?
因为我有两种类型的ModelView对象(示例中的A和B):如果API的调用者是AMX设备则返回一个,而另一个则响应其余的调用者。 但是,在任何一种情况下,我都必须搜索数据库,并返回的数据组成一个“标准”ModelView或“AMX”ModelView,具体取决于调用者。
所以我正在寻找类似的东西:
public IHttpActionResult Action(int id)
{
Patient patient = patientRepository.GetFirstOrDefault(p => p.PatientId == id);
if(route == "/api")
{
return new Ok(new A{Name = patient.Name});
}
else if(route == "/api/AMX")
{
return new Ok(new B{AMXPatientName = patient.Name});
}
}
我认为一个好的解决方案是检查路线并根据它来构建对象,但是如果它是某种偏差,请告诉我实现它的正确方法......也许只是实现不同的动作,但在这种情况下,我必须在“返回”之前复制所有代码,就像示例中的数据库调用一样。
谢谢!