ASP.NET MVC 4 - 基于请求的替代渲染

时间:2013-06-13 11:18:03

标签: asp.net asp.net-mvc json asp.net-mvc-4 razor

尝试实现一个系统,开发人员可以按照惯例创建一个cshtml Razor视图(例如,一系列@ Html.EditorFor(t => t.MyProperty)调用穿插标记等)但基于某些标题在请求中提出不同的回应。

举个例子:

标准用户通过在浏览器中键入路线来导航到操作,获取标准的预期HTML结果。

非人类系统访问与用户相同的URL,但包含用于标识自身的HTTP标头,获取自定义输出。在这种情况下,自定义输出是使用EditorFor调用定义的字段的JSON表示。

我通过创建一个名为CustomEditorFor的新帮助程序得到了相当远的结果,如果hte标题存在则转储JSON,或者如果不是HtmlHelper.EditorFor,则转出JSON,但这给了我一些限制 - 我需要每个字段以逗号分隔并包装为JSON集合,但帮助程序可用的信息似乎没有给出任何关于它是视图中的第一个/最后一个等的上下文。

我正在调查我需要覆盖的地方,以便相对干净地做到这一点。到目前为止,看起来我需要一个自定义的IView实现(或者更可能是子类RazorView)和一个ViewEngine的自定义实现(我们已经将RazorViewEngine子类化为处理路径等,所以这不是问题)它看起来像为了获得绝对理想的结果,我可能还需要创建WebViewPage或WebPageBase的子类,以便能够影响响应中显示或未显示的内容等。

我确实有一些限制:

  1. 我无法为此
  2. 使用单独的视图文件
  3. 由于(1),我无法将JSON的位放在视图文件中。默认情况下,它需要正确呈现为HTML,并且只需要存在正确标题的JSON
  4. 有没有人沿着这些方向做过什么?我在正确的道路上吗?有更简单的方法吗?感觉难以置信地过度工作,但我现在看不到任何其他干净利落的方式。

1 个答案:

答案 0 :(得分:0)

您想到的一种方式,以及您需要最少量工作的方法如下: 首先,您可以使用DisplayModeProvider并为您的特定代理注册模式。以下是如何注册iPhone(浏览器)。使用自定义扩展程序

 protected void Application_Start()
    {
        DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("iPhone")
        {
            ContextCondition = (context => context.GetOverriddenUserAgent().IndexOf
                ("iPhone", StringComparison.OrdinalIgnoreCase) >= 0)
        });

       ...
    }

其次,您可以使用自定义扩展程序(myView.MyCustomExtention.cshtml

为每个视图编写一个视图

来自您的目标代理商的请求将使用您的自定义扩展程序

制作MVC渲染视图

第三,您可以使用@Html.RenderPartial()

在自定义扩展程序中在视图中呈现视图

由于您已经为每个控件呈现了适当的JSoN CustomEditorFor,因此新创建的视图使您能够添加开始和结束括号。

就逗号而言,您可以在CustomEditorFor中的每个元素后面添加一个逗号,并在JSON中使用虚拟最后一个元素来删除最后一个逗号(或者如果视图中只有一个元素)< / p>

免责声明:这是基于我的理论知识。我自己还没有这样做过。