2011-09-30 16 views
2

我不知道这是否是接近某件事的正确方法,但我希望是这样。下面的例子是一个沉重的控制器,绝对是错误的方法,但它得到了我正在寻找的想法。如何使ASP.NET MVC Action返回不同的格式?

public class PeopleController : Controller 
{ 
    public ActionResult List(string? api) 
    { 
     MyViewModel Model = new MyViewModel(); 

     if (api == "json") { 

      // I'd like to return the Model as JSON 

     } else if (api == "XML") { 

      // I'd like to return the Model as XML 

     } else { 

      return View(Model); 
     } 
    } 
} 

现在我需要能够做的是模型返回查看,如果它被要求这样

http://example.com/People/List

但是我也喜欢输出JSON如果这样要求的话

http://example.com/People/List/?api=json

或者输出XML,如果它的要求是这样

http://example.com/People/List/?api=xml

这是完全错误的?
如果不是,那么实现此目标的最佳方法是什么?

我想用一个自定义MultiPurposeResult实现它,可以做所有的过滤为我,然后返回它,因为这

public class PeopleController : Controller 
{ 
    public MultiPurposeResult List(string? api) 
    { 
     MyViewModel Model = new MyViewModel(); 
     return MultiPurpose(Model);  } 
    } 
} 

编辑
的我发现这个博客里面做同样的方法,因为我的第一个代码块。
http://shouldersofgiants.co.uk/Blog/post/2008/10/16/Creating-a-RESTful-Web-Service-Using-ASPNet-MVC-Part-5a-e28093-HTTP-Response-Codes.aspx

+0

作为一个侧面说明,'MultiPurposeResult'是不是最好的名字......我喜欢要知道什么是适当的结果名称应该是...我似乎总是在命名上挣扎。 –

+0

也许'RestActionResult'是一个更好的名字? –

回答

5

同意@Matt。不要明确地要求响应类型,内容类型推断它在请求中,这是更加RESTful。

例如,创建了一个基本枚举类型封装你想要的响应类型:

public enum RestfulResultType 
{ 
    Json, 
    Html, 
    Xml 
} 

然后比套在你的行动创建一个自定义的模型绑定这一特性,根据内容类型。

那么你的控制器看起来是这样的:

public ActionResult List(RestfulResultType resultType) 
{ 
    var data = repo.GetSomeData(); 

    switch (resultType) 
    { 
     case RestfulResultType.Json: 
     return Json(data); 
     case RestfulResultType.Xml: 
     return XmlResult(data); // MvcContrib 
     case RestfulResultType.Html: 
     return View(data); 
    } 
} 

如果您需要任何更多的定制比普通的助手提供,然后创建自定义ActionResult的。

您可以将返回类型保留为ActionResult - 这就是要点,以便控制器可以返回不同的格式。

ResfulResultTypeModelBinder.cs

public class ResfulResultTypeModelBinder: IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
    if (controllerContext.HttpContext.Request.ContentType == "application/json") 
     return RestfulResultType.Json; 
    // other formats, etc. 
    } 
} 

的Global.asax:

ModelBinders.Binders.Add(typeof(RestfulResultType), new RestfulResultTypeModelBinder()); 
+0

我喜欢这个,除了我不想为每个ActionResult(我在应用程序中都有几十个)写一个开关......我想我仍然会创建一个自定义返回类型。你能详细说一下'enum RestfulResultType'吗? –

+0

@rock - 没什么大不了的。只是魔术弦的替代品。如果不是开关,那么你如何返回不同的类型?你是什​​么意思“每个ActionResult”?你的意思是每个“结果类型”(例如json,xml)。怎么会有几十个? – RPM1984

+0

在我宁静的应用程序中,我有数十个动作...(对不起,不是ActionResults)。我不想为每个Controller编写每个Action的开关,我宁愿写一个Custom Result Type,然后将开关写入它。 –

1

您可以创建自定义MultiPurposeResult但我个人从方法签名失去string? api,而不是具有多用途寻找的Request["format"]存在,然后做什么格式可以输出测定结果因为格式与ActionResult没有任何关系,但更多的是响应的格式。

相关问题