我不知道这是否是接近某事的正确方法,但我希望是这样。下面的例子是一个沉重的控制器,绝对是错误的方法,但它是我想要的想法。
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,如果它是这样请求的那样:
但是我希望它输出JSON,如果这样请求:
如果像这样请求输出XML:
这是完全错的吗?如果没有,实现这一目标的最佳方法是什么?
我正在考虑使用自定义MultiPurposeResult
来实现它,它可以为我执行所有过滤,然后将其作为此返回
public class PeopleController : Controller
{
public MultiPurposeResult List(string? api)
{
MyViewModel Model = new MyViewModel();
return MultiPurpose(Model); }
}
}
答案 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没有任何关系,但更多的是响应的格式。