如何使ASP.NET MVC Action返回不同的格式?

时间:2011-09-30 00:08:35

标签: asp.net-mvc web-services asp.net-mvc-3 actionresult

我不知道这是否是接近某事的正确方法,但我希望是这样。下面的例子是一个沉重的控制器,绝对是错误的方法,但它是我想要的想法。

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);
        }
    }
}

现在我需要做的是将模型返回给View,如果它是这样请求的那样:

  

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);      }
    }
}

2 个答案:

答案 0 :(得分:5)

同意@Matt。不要明确要求响应类型,推断来自请求中的 contentType ,它更加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());

答案 1 :(得分:1)

您可以创建自定义 MultiPurposeResult ,但我个人会丢失方法签名中的string? api,而是让MultiPurpose查找Request["format"]的存在,然后进行确定可能输出结果的格式。由于格式与ActionResult没有任何关系,但更多的是响应的格式。