尝试实现一个系统,开发人员可以按照惯例创建一个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的子类,以便能够影响响应中显示或未显示的内容等。
我确实有一些限制:
有没有人沿着这些方向做过什么?我在正确的道路上吗?有更简单的方法吗?感觉难以置信地过度工作,但我现在看不到任何其他干净利落的方式。
答案 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>
免责声明:这是基于我的理论知识。我自己还没有这样做过。