根据参数从任何ASP.NET MVC控制器操作返回JSON

时间:2016-08-20 18:29:17

标签: c# asp.net asp.net-mvc

在开发过程中,我经常编写这样的控制器方法,这样我就可以确保正确填充模型的内容并帮助开发视图。

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

我猜测我需要走的路是实现我自己的视图引擎,但我不确定这是否正确。

1 个答案:

答案 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))
    }
}