C# 控制器中的MVC渲染部分脚本
我想将控制器中.cshtml视图的“scripts”部分呈现为字符串。这可能吗 我实际上想做的是通过一个单独的ajax调用获取脚本,然后在加载了视图的html之后,在脚本上运行eval 我试着寻找相关的话题,但没有找到任何相关的。一些相关的答案与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)返回视图中使用的
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”}
- 无布局渲染内容-当使用
方法返回视图时,它将渲染视图的整个内容,而不显示任何布局或任何部分。这相当于使用返回视图并在_ViewStart.cshtml中将PartialView()
设置为null)布局
- 不带任何内容的渲染部分-您可以拥有一个布局,该布局只有一个
方法。然后,如果您使用该布局返回一个视图,它只渲染该视图的指定部分,并将忽略该内容渲染部分
- 带/不带节的脚本-考虑到上述选项,当您将脚本放入脚本标记而不放入
,您可以保证它们将作为结果的一部分返回,无论调用return节
或returnView
或是否具有PartialView
。因此,在某些情况下,您可能希望放置不带节的脚本。在这种情况下,当您使用ajax调用加载部分视图时,它包含部分视图的内容和脚本。布局
在某些情况下,即使对于部分视图,您也可能希望有一些公共内容/脚本,在这种情况下,您可以使用Section,还可以使用一个布局页面来呈现该部分,并包含您希望在所有部分视图中都有的公共内容。在这种情况下,您需要使用return
返回部分视图,并指定特定的l布局页面view
布局
页面和
\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)