Asp.net mvc 我的Razor文件中的内联javascript-我可以拥有这个吗;包括「;从外部文件

Asp.net mvc 我的Razor文件中的内联javascript-我可以拥有这个吗;包括「;从外部文件,asp.net-mvc,Asp.net Mvc,我有很小的javascript块。我希望在代码中内联显示这些相同的块,但不希望在每个文件中重复它们。有没有一种方法可以将代码“包含”到Razor文件中而不涉及 <script src="@Url.Content("~/Scripts/small_script_block1.js")" type="text/javascript"></script> 谢谢 创建局部视图并粘贴到标记中。您可以使用@RenderSection语法 <head> @Re

我有很小的javascript块。我希望在代码中内联显示这些相同的块,但不希望在每个文件中重复它们。有没有一种方法可以将代码“包含”到Razor文件中而不涉及

<script src="@Url.Content("~/Scripts/small_script_block1.js")" type="text/javascript"></script>

谢谢


创建局部视图并粘贴到标记中。

您可以使用@RenderSection语法

<head>
    @RenderSection( "JavaScript", optional : true)
</head>

@RenderSection(“JavaScript”,可选:true)
在身体的某个地方,添加

@section JavaScript
{
    <script src="/Scripts/script.js" type="text/javascript"></script>
}
@节JavaScript
{
}
编辑: 或者,如果您更喜欢内联,则如下所示:

@section JavaScript
{
    <script type="text/javascript">
    function doSomething() {
    }
    </script>
}
@节JavaScript
{
函数doSomething(){
}
}

另一种可能需要我多花几分钟来写:

为HtmlHelper创建扩展方法。在cshtml文件中,它将如下所示:

@Html.InlineScriptBlock("~/scripts/small_script_block1.js")
如果你愿意,我可以给你发送实现,但这个想法可能就是你所需要的。如果没有,请添加评论,我会写下来

编辑下面的代码(不美观且未暗示或给出保修:)

公共静态类HtmlHelperExtensions
{
公共静态MvcHtmlString InlineScriptBlock(此HtmlHelper HtmlHelper,字符串路径)
{
var builder=新标记生成器(“脚本”);
Add(“type”,“text/javascript”);
var physicalPath=htmlHelper.ViewContext.RequestContext.HttpContext.Server.MapPath(路径);
if(File.Exists(physicalPath))
{
builder.InnerHtml=File.ReadAllText(物理路径);
}
返回MvcHtmlString.Create(builder.ToString());
}
}
请记住,如果将其放入项目中,则需要使名称空间对视图可见。与可以在顶部提供标记的ASP.NET WebForms不同,Razor要求您在Views文件夹的Web.config文件中执行此操作

<pages pageBaseType="System.Web.Mvc.WebViewPage">
  <namespaces>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Routing" />
    <add namespace="Your.Namespace.Here.Extensions" />
  </namespaces>
</pages>


我认为这与李的要求相反。不过,这是使用布局的一个重要设计考虑因素(对于那些更熟悉WebForms的人来说,又称母版页),谢谢,但我希望javascript内联。您只是将对外部文件的调用从主体的布局中移动。@codemonkeyking-我考虑过这一点,但重点放在了问题中关于代码块的部分,因此RenderSection似乎是一个很好的解决方案。正如您所建议的,RenderPage也是一个非常好的解决方案。我更新了示例,以展示如何使用RenderSection插入内联代码。谢谢Leons,但您的解决方案只是将代码从布局移动到razor页面。我需要把它从剃须刀页面上完全移开。我想这里还有一些其他的解决方案可以满足我的需要。李:谢谢你。您的inlineScriptBlock看起来不错。你有没有可能把代码贴出来让我看看。顺便说一句,我想我看到了一个使用@Html.Partial从外部文件呈现js的实现。现在我在这一页上看不到了。你认为这是一个好办法吗。LeeI“删除”了这个建议,因为我认为InlineScriptBlock可能是一个更好的主意,因为可以包含一个“原始”Javascript文件。我现在正在进行实施,并将在功能正常时编辑此答案。非常感谢您花时间帮助我。Lee谢谢你,Monkeyking。我以前使用过扩展方法,这个看起来不错。也可能对我以后使用和修改其他需求有好处。如果您有时间,可以告诉我这与使用不同的RenderPage、@Html.Partial或@Html.RenderPartial选项是否有很大不同如果您不想接触web.config,可以在Razor视图中使用@using导入命名空间。(尽管如果您重复@using,无论如何使用web.config可能是个好主意。)谢谢CodeMonkey。我应该使用RenderPage、@Html.Partial还是@Html.RenderPartial。我对所有不同的选择都感到困惑。我想要的是我的页面被包括在预编译中。在编译页面之前,所有这些选项都包括js吗?谢谢,Lee看看我的另一个答案。为了避免混淆,如果您喜欢答案,我可以删除此页@我相信RenderPage相当于@Html.RenderPartial。在MVC2@Html.Partial中,用于呈现局部视图(您仍然可以使用此w/MVC3和Razor)@Html.RenderPartial将响应写入输出流,因此您的MVC2版本会让您使用vs。这是从“职业ASP.NET MVC 2”WROX中转述出来的-
public static class HtmlHelperExtensions
{
    public static MvcHtmlString InlineScriptBlock<TModel>(this HtmlHelper<TModel> htmlHelper, string path)
    {
        var builder = new TagBuilder("script");
        builder.Attributes.Add("type", "text/javascript");

        var physicalPath = htmlHelper.ViewContext.RequestContext.HttpContext.Server.MapPath(path);
        if (File.Exists(physicalPath))
        {
            builder.InnerHtml = File.ReadAllText(physicalPath);
        }

        return MvcHtmlString.Create(builder.ToString());
    }
}
<pages pageBaseType="System.Web.Mvc.WebViewPage">
  <namespaces>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Routing" />
    <add namespace="Your.Namespace.Here.Extensions" />
  </namespaces>
</pages>