Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.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
C# 控制器中的MVC渲染部分脚本_C#_Asp.net_.net_Asp.net Mvc_Razor - Fatal编程技术网

C# 控制器中的MVC渲染部分脚本

C# 控制器中的MVC渲染部分脚本,c#,asp.net,.net,asp.net-mvc,razor,C#,Asp.net,.net,Asp.net Mvc,Razor,我想将控制器中.cshtml视图的“scripts”部分呈现为字符串。这可能吗 我实际上想做的是通过一个单独的ajax调用获取脚本,然后在加载了视图的html之后,在脚本上运行eval 我试着寻找相关的话题,但没有找到任何相关的。一些相关的答案与HtmlHelper.ViewContext.HttpContext.Items[“”]混在一起,但我不确定如何使用它 我想要的是这样的:stringscripts=GetScriptsForView(action,controller)返回视图中使用的

我想将控制器中.cshtml视图的“scripts”部分呈现为字符串。这可能吗

我实际上想做的是通过一个单独的ajax调用获取脚本,然后在加载了视图的html之后,在脚本上运行eval

我试着寻找相关的话题,但没有找到任何相关的。一些相关的答案与
HtmlHelper.ViewContext.HttpContext.Items[“”]
混在一起,但我不确定如何使用它

我想要的是这样的:
stringscripts=GetScriptsForView(action,controller)
返回视图中使用的节,如下所示:
@section Scripts{

澄清(编辑):

我试图用ajax调用替换布局页面的“RenderBody()”,这样就不必每次都加载包含静态标题的布局

我已经成功地用ajax调用替换了所有
-标记,替换了包含视图的
,但无法让javascripts正常工作

我可以从cshtml文件中删除
@section scripts{
,让脚本标记与html视图一起加载。问题是,如果我重新加载页面,它会在调用布局页面的脚本之前调用该视图的脚本,从而导致错误。因此,我希望单独加载脚本。

TL;DR 虽然您可以在单独的请求中加载节和内容(参见示例1),但您不需要这样做。相反:

  • 您可以为不同的目的使用不同的
    布局
    页面,并动态决定视图使用哪种布局。例如,对于普通请求使用完整布局页面,对于ajax请求使用不带页眉和页脚的简单布局页面(参见示例2)

  • 您可以根据不同的请求参数(如
    request.Headers
    request.QueryString
    request.IsAjaxRequest
    )在
    \u ViewStart.cstml
    或控制器中动态决定布局页面

长话短说 以下是一些关于布局、剖面、视图和局部视图的有用注释,可帮助您处理此案例:

  • 在返回视图中指定布局()-返回
    视图时,可以指定视图的布局。例如,返回
    视图(“索引”,母版名:“\u SomeLaypout”)
    。可以使用一些逻辑动态决定布局名称

  • 在\u LayoutStart.cshtml中指定布局-当返回
    视图
    时,您可以在
    \u ViewStart.cshtml
    文件中指定
    布局
    ,例如
    @{Layout=“\u Layout”}
    。您可以使用一些逻辑来动态决定布局名称

  • 无布局渲染内容-当使用
    PartialView()
    方法返回视图时,它将渲染视图的整个内容,而不显示任何布局或任何部分。这相当于使用返回视图并在_ViewStart.cshtml中将
    布局
    设置为null)

  • 不带任何内容的渲染部分-您可以拥有一个布局,该布局只有一个
    渲染部分
    方法。然后,如果您使用该布局返回一个视图,它只渲染该视图的指定部分,并将忽略该内容

  • 带/不带节的脚本-考虑到上述选项,当您将脚本放入脚本标记而不放入
    ,您可以保证它们将作为结果的一部分返回,无论调用return
    View
    或return
    PartialView
    或是否具有
    布局
    。因此,在某些情况下,您可能希望放置不带节的脚本。在这种情况下,当您使用ajax调用加载部分视图时,它包含部分视图的内容和脚本。
    在某些情况下,即使对于部分视图,您也可能希望有一些公共内容/脚本,在这种情况下,您可以使用Section,还可以使用一个布局页面来呈现该部分,并包含您希望在所有部分视图中都有的公共内容。在这种情况下,您需要使用return
    view
    返回部分视图,并指定特定的l布局页面

示例1-在ajax请求中仅返回脚本或内容 下面的示例显示了如何发送ajax请求以获取内容,以及如何发送ajax请求以获取脚本部分

请注意,我不建议使用不同的请求来获取 内容或单独获取脚本,此示例仅用于 学习目的:向您展示如何使用
布局
页面和
\u ViewStart

为此,请执行以下步骤:

  • \u ViewStart.cshtml
    内容更改为:

    @{
        if(Request.QueryString["Layout"]=="_Body")
        {
            //Just content of the page, without layout or any section
            Layout = null; 
        }
        else if (Request.QueryString["Layout"] == "_Script")
        {
            //Just script section
            Layout = "~/Views/Shared/_Script.cshtml"; 
        }
        else
        {
            //Everything, layout, content, section
            Layout = "~/Views/Shared/_Layout.cshtml"; 
        }
    }
    
    @{
        if(Request.IsAjaxRequest())
        {
            Layout = "~/Views/Shared/_Partial.cshtml";
        }
        else 
        {
            Layout = "~/Views/Shared/_Layout.cshtml";
        }
    }
    
    注意:根据您的需求,您可以轻松依赖
    请求.Header
    请求.IsAjaxRequest()
    或…而不是
    请求.QueryString

  • 然后,仅针对
    \u Script
    ,添加一个名为
    \u Script.cshtml
    的新布局页面,该页面具有以下内容:

    @RenderSection("scripts", required: false)
    
    @RenderBody()
    @RenderSection("scripts", required: false)
    
  • 然后:

    • 要获取脚本部分,请发送一个普通ajax请求并添加以下查询字符串:
      Layout=\u script

    • 要获取不带脚本部分的内容,请发送普通ajax请求并添加以下查询字符串:
      Layout=\u Body

    • 要获取全部内容,请发送一个普通的ajax请求,而不指定任何布局查询字符串

    例如,假设您在
    主页
    控制器中有一个
    示例
    操作:

    [HttpGet]
    public ActionResult Sample()
    {
        return View();
    }
    
    [HttpGet]
    public ActionResult Sample()
    {
        return View();
    }
    
    返回以下
    Sample.cshtml
    视图:

    <div id="div1" style="border:1px solid #000000;">
        some content
    </div>
    @section scripts {
        <script>
            $(function () {
                alert('Hi');
            });
        </script>
    }
    
    <div id="div1" style="border:1px solid #000000;">
        some content
    </div>
    @section scripts {
        <script>
            $(function () {
                alert('Hi');
            });
        </script>
    }
    
  • 添加名为
    \u PartialView.cshtml
    的新布局页面,该页面包含以下内容:

    @RenderSection("scripts", required: false)
    
    @RenderBody()
    @RenderSection("scripts", required: false)