MVC 5 WebApi Action根据路由返回不同的对象类型

时间:2015-09-14 14:53:38

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

在带有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});
    }
}

我认为一个好的解决方案是检查路线并根据它来构建对象,但是如果它是某种偏差,请告诉我实现它的正确方法......也许只是实现不同的动作,但在这种情况下,我必须在“返回”之前复制所有代码,就像示例中的数据库调用一样。

谢谢!

0 个答案:

没有答案