Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET MVC 4-基于请求的可选渲染_Asp.net_Asp.net Mvc_Json_Asp.net Mvc 4_Razor - Fatal编程技术网

ASP.NET MVC 4-基于请求的可选渲染

ASP.NET MVC 4-基于请求的可选渲染,asp.net,asp.net-mvc,json,asp.net-mvc-4,razor,Asp.net,Asp.net Mvc,Json,Asp.net Mvc 4,Razor,试图实现一个系统,开发人员将按照通常的方式创建一个cshtml Razor视图,例如,一系列@Html.EditorFort=>t.MyProperty调用,其中穿插有标记等,但基于请求中的某些标头来区分响应 例如: 标准用户通过在浏览器中键入路由来导航到操作,获得标准的、预期的HTML结果 非人工系统访问与用户相同的URL,但包含一个HTTP头以标识自身,并获取自定义输出。本例中的自定义输出是用EditorFor调用定义的字段的JSON表示 通过创建一个名为CustomEditorFor的新助

试图实现一个系统,开发人员将按照通常的方式创建一个cshtml Razor视图,例如,一系列@Html.EditorFort=>t.MyProperty调用,其中穿插有标记等,但基于请求中的某些标头来区分响应

例如:

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

非人工系统访问与用户相同的URL,但包含一个HTTP头以标识自身,并获取自定义输出。本例中的自定义输出是用EditorFor调用定义的字段的JSON表示

通过创建一个名为CustomEditorFor的新助手,我已经在这方面取得了相当大的进展,如果存在hte头,它会转储JSON,如果不存在,则遵从HtmlHelper.EditorFor,但这给了我一些限制——我需要每个字段以逗号分隔并包装为JSON集合,但助手可用的信息似乎没有给我任何关于它在视图中是否是第一个/最后一个等的上下文

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

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

我不能对此使用单独的视图文件 由于1,我无法将JSON的位放入视图文件中。默认情况下,它需要正确地呈现为HTML,并且只呈现为存在正确标题的JSON
有人做过类似的事情吗?我走对了吗?有没有更简单的方法?感觉难以置信的过度工程化,但我目前看不到任何其他干净的方法。

想到的一种方法是,您需要最少的工作量,如下所示: 首先,您可以使用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中使用一个虚拟的最后一个元素来除去最后一个逗号,或者在视图中只有一个元素的情况下


免责声明:这是基于我的理论知识。我还没有独立完成这项工作

对于普通请求和基于机器的请求,url结构必须完全相同吗?您可以将Web API与MVC4一起使用,MVC4将以Json响应。限制是您必须使用包含/api/的不同url。不幸的是,它必须是相同的,但您的思路是正确的。最终,这是一个输出被首选为带有HTML回退的JSON的情况,因此,如果没有重定向,备用URL将无法工作,我希望避免重定向。为了提供更多信息,本质上,该应用程序设计用于单页应用程序或IOS/Android本机应用程序,这就是JSON要求的来源,但是普通用户浏览应用程序时也会使用相同的URL,从而生成HTML。目的是让开发人员一次性创建他们的视图模型和视图,以HTML为目标,让设备和单页应用程序能够以JSON的形式获取他们需要的数据,而无需呈现/解析HTML。我认为您不必担心覆盖任何视图功能。如果操作返回ActionResult,则可以根据Request.Headers集合中的KeyValue在JSonResult和ViewResult之间切换。如果这看起来仍然有点脏,您可以将其抽象到另一个类中吗?