在开发过程中,我经常编写这样的控制器方法,这样我就可以确保正确填充模型的内容并帮助开发视图。
public ActionResult SomeMethod(int id, bool asJson = false)
{
var model = SomeBackendService.GetModel(id);
if(asJson)
return Json(model, JsonRequestBehavior.AllowGet);
return View(model);
}
我在视图开发完成后更改它们,但有时我发现自己希望以后可以将结果作为JSON获取。
理想情况下,我想设置一个Web.config密钥,该密钥允许将控制器方法作为JSON请求,而无需为每个控制器重新编码每个方法。我希望以下方法在使用特定查询字符串参数请求时将模型作为JSON返回。
public ActionResult SomeMethod(int id)
{
var model = SomeBackendService.GetModel(id);
return View(model);
}
我猜测我需要走的路是实现我自己的视图引擎,但我不确定这是否正确。
答案 0 :(得分:0)
实际上,我想出了如何使用自定义DisplayModeProvider执行此操作。
我突然想到,我真正需要做的就是使用一个可以渲染JSON的视图。所以我创建了一个自定义DisplayProvider来覆盖TransformPath方法:
public class JsonOnlyDisplayProvider : DefaultDisplayMode
{
public JsonOnlyDisplayProvider(string suffix) : base(suffix) { }
protected override string TransformPath(string virtualPath, string suffix)
{
return "~/Views/Shared/JsonOnly.cshtml";
}
}
然后我修改了Global.asax中的Application_Start
方法,以插入带有ContextCondition的新提供程序,该ContextCondition用于评估AppSetting和querystring参数。
protected void Application_Start()
{
DisplayModeProvider.Instance.Modes.Insert(0,
new JsonOnlyDisplayProvider(DisplayModeProvider.DefaultDisplayModeId)
{
ContextCondition = context =>
(context.Request.QueryString["asJson"] == "true" &&
!string.IsNullOrEmpty(ConfigurationManager.AppSettings["AllowJson"]) &&
ConfigurationManager.AppSettings["AllowJson"] == "true")
});
}
最后一步是创建将显示JSON的通用视图。 (当然,这种方法没有添加适当的标题......我对如何对其进行排序提出建议)
JsonOnly.cshtml
@{
Layout = null;
if (Model != null)
{
@Html.Raw(Json.Encode(Model))
}
}