1

尝试实现一个系统,开发人员可以照常创建一个 cshtml Razor 视图(例如,一系列 @Html.EditorFor(t=>t.MyProperty) 调用,其中散布着标记等),但基于某些标题请求不同的响应。

举个例子:

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

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

通过创建一个名为 CustomEditorFor 的新帮助程序,我已经取得了相当大的进展逗号分隔并包装为 JSON 集合,但助手可用的信息似乎没有给我任何关于它是视图中的第一个/最后一个等的上下文。

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

我在这里确实有一些限制:

  1. 我不能为此使用单独的视图文件
  2. 由于 (1),我无法将 JSON 的位放入视图文件中。默认情况下,它需要正确呈现为 HTML,并且仅呈现为存在正确标头的 JSON

有没有人在这些方面做过任何事情?我在正确的道路上吗?有没有更简单的方法来做到这一点?感觉令人难以置信的过度设计,但我目前看不到任何其他方法可以干净地做到这一点。

4

1 回答 1

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

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

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

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

于 2013-06-13T11:49:09.357 回答