Согласен с @Matt. Не запрашивайте явно тип ответа, вывод его из contentType в запросе, который является более RESTful.
Например, создан базовый тип enum для инкапсуляции нужных типов ответов:
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());