gpt4 book ai didi

asp.net-mvc - 如何让 ASP.NET MVC Action 返回不同的格式?

转载 作者:行者123 更新时间:2023-12-02 08:52:21 25 4
gpt4 key购买 nike

我不知道这是否是处理某事的正确方法,但我希望它是。下面的示例是一个沉重的 Controller ,绝对是错误的方法,但它是我正在寻找的东西的想法。

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

最佳答案

同意@Matt。不要明确要求响应类型,推断它来自请求中的 contentType,这更符合 RESTful。

例如,创建一个基本的枚举类型来封装你想要的响应类型:

public enum RestfulResultType
{
Json,
Html,
Xml
}

然后创建一个自定义模型 Binder ,然后根据内容类型在您的操作中设置此属性。

然后你的 Controller 看起来像这样:

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 - 这就是重点,以便 Controller 可以返回不同的格式。

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

关于asp.net-mvc - 如何让 ASP.NET MVC Action 返回不同的格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7604713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com