我没有看到任何比自定义模型活页夹更好的替代品。我将在这里发布我的活页夹实现,以防其他人看到。使用模型绑定器允许将 Accept 标头强绑定到操作的直接输入,从而允许直接测试返回类型,并且不会强制您人为地执行超出您需要的操作,也不会导致动态类型化的视图数据/包。
这是具有支持枚举类型的模型绑定器:
public enum RequestAcceptType
{
NotSpecified,
Json,
Xml
}
public class RequestAcceptTypeModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException("bindingContext");
}
RequestAcceptType acceptType = RequestAcceptType.NotSpecified;
// Try for Json
if (controllerContext.HttpContext.Request.AcceptTypes.Contains("application/json") || controllerContext.HttpContext.Request.Url.Query.Contains("application/json"))
{
acceptType = RequestAcceptType.Json;
}
// Default to Xml
if (acceptType == RequestAcceptType.NotSpecified)
{
acceptType = RequestAcceptType.Xml;
}
return acceptType;
}
}
这是 Application_Start 方法中 Global.asax 中的相关位:
ModelBinders.Binders[typeof(RequestAcceptType)] = new RequestAcceptTypeModelBinder();
然后要在您的操作中使用它,只需使用枚举类型创建一个参数(任何名称):
public ActionResult Index(RequestAcceptType acceptType)
如果几天内没有人用更好的方法做出回应,我会接受这个作为答案。