2

我不知道这是否是处理某事的正确方法,但我希望它是。下面的示例是一个重型控制器,绝对是错误的方法,但它得到了我正在寻找的想法。

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

2 回答 2

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.
   }
}

全球.asax:

ModelBinders.Binders.Add(typeof(RestfulResultType), new RestfulResultTypeModelBinder());
于 2011-09-30T01:29:10.853 回答
1

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

于 2011-09-30T00:17:56.400 回答