【问题标题】:How to embed Razor C# code in a .js file?如何在 .js 文件中嵌入 Razor C# 代码?
【发布时间】:2023-03-30 01:21:01
【问题描述】:

必须嵌入javascript代码块

<script type='text/javascript'>
  ...
</script>

但 Razor 代码不会在 .js 文件中编译,该文件包含在 .cshtml 文件中。

如何做到这一点?或者有没有其他优雅的方式来产生类似的效果?

谢谢。

【问题讨论】:

  • ... 动态生成 JavaScript 的人深受其害。您不会在 javascript 文件中嵌入 Razor 代码,因为 JAVASCRIPT 文件是静态的。
  • 您最好寻求帮助以解决您正在尝试解决的问题。因此,从详细说明问题开始,然后是您尝试的解决方案。您目前尝试解决它的方式不好。
  • 我会尝试找到一个更通用的解决方案,否则我需要在这里多次询问不同的情况。

标签: c# javascript asp.net-mvc-3 razor


【解决方案1】:

你不能。你也不应该尝试。将它们分开。这反过来也适用,但您应该查看Unobtrusive JavaScript。在整个项目中应用的设计模式是个好主意。

【讨论】:

  • 我确实尝试过 Unobtrusive JavaScript,但在某些情况下,我需要更新不同的元素,或者更新可以使用 jQuery 语句 $('#bla').parent 检索的 parent 元素(),或者只是根据响应采取不同的行动。我可能没有深入研究它,但 AFAIK 它不能满足我的需要。
【解决方案2】:

当我遇到这个问题时,有时我会在 .js 文件中提供一个可以在 .cshtml 文件中访问的函数...

// someFile.js
var myFunction = function(options){
    // do stuff with options
};

// razorFile.cshtml
<script>
    window.myFunction = new myFunction(@model.Stuff);
    // If you need a whole model serialized then use...
    window.myFunction = new myFunction(@Html.Raw(Json.Encode(model)));
</script>

不一定是最好的选择,但如果你必须这样做,它会做......

您可以尝试的另一件事是在您的 html 元素上使用数据属性,就像 jQuery.validate.unobtrusive 所做的那样......

//someFile.js
var options = $("#stuff").data('stuff');

// razorFile.cshtml
<input type="hidden" id="stuff" data-stuff="@model.Stuff" />

【讨论】:

  • +1,我也会在视图中设置变量/js 对象。通常这是需要通过 ajax 访问的 URL 的情况。例如&lt;script&gt;var ajaxUrl = '@Url.Action('Blah", "Blah", new { id = Model.Id});&lt;/script&gt;
  • 我喜欢他的第二个选项。这有点奇怪,但它有效。
  • 您可以在 cshtml 视图中添加一个“部分”并定义一个变量,如:variable = @Model.Parameter。在 js 文件的开头定义:var Parameter; 然后你可以在 js 文件中访问这个变量,只需在其中输入你想要的参数。
【解决方案3】:

虽然我同意您在 Javascript 文件中使用 Razor 时应该三思而后行,但有一个 Nuget 包可以为您提供帮助。它叫做RazorJS

包的作者有一个关于它的blog post,它解释了如何使用它。

【讨论】:

    【解决方案4】:

    也许我可以提供一个有用的解决方法,具体取决于您希望完成的工作。

    我很想找到一种方法来评估 Java 脚本文件中的剃刀表达式。我想附加一个 jQuery click 事件处理程序来提交在许多页面上找到的特定类。这应该在 jQuery 文档就绪事件处理程序中完成。此单击事件将执行 ajax 调用。

    这些 url 应该是应用程序相关的,而不是绝对的,以防应用程序位于根级别以下。所以,我想使用类似

    $(document).ready(function () {
        $('input[type="submit"].checkit)').click(function (e) {
            $.ajax({
                type: 'POST',
                url: '@Url.Content("~/checkit")', //Razor expression here
                dataType: 'json',
                success: function (data) {
                    if (!data) {
                        e.preventDefault();
                        handleResponse(data);
                    }
                },
                data: null,
                async: false
            });
        });
    });
    

    我通过将代码包装在函数 Checkit 中并将调用移动到布局视图来解决这个问题:

            $(document).ready(function () {
                Checkit('@Url.Content("~/checkit")');
            });
    

    大部分 javascript 代码仍在 javascript 文件中。

    【讨论】:

      【解决方案5】:

      这里有一个示例 Razor 网页(不是 MVC 视图,虽然类似),它将提供 Javascript。当然,动态编写 Javascript 文件是不典型的,但这里有一个示例。我曾经在我希望提供 JSON 数据和其他一些计算成本高且很少更改的东西的情况下使用它——因此浏览器可以包含它并像普通的 JS 文件一样缓存它。这里的技巧只是设置Response.ContentType,然后在你的Javascript中使用类似Razor的&lt;text&gt;标签。

      @{
      Response.ContentType = "text/javascript";
      Response.Cache.SetLastModified(System.Diagnostics.Process.GetCurrentProcess().StartTime);
      Response.Cache.SetExpires(System.DateTime.Now.Date.AddHours(28));
      Response.Cache.SetCacheability(System.Web.HttpCacheability.Public);
      <text>
      var someJavaScriptData = @someSortOfObjectConvertedToJSON;
      function something(whatever){
      }
      </text>
      }
      

      然后您可以将其包含在您的其他 Razor 文件中:

      <script src="MyRazorJavascriptFile.cshtml"></script>
      

      【讨论】:

        【解决方案6】:

        那么包含一个只包含 js 的 .cshtml 呢?

        .csthml 父级

        @RenderPage("_scripts.cshtml")
        

        包含js的_scripts.cshtml

        <script type="text/javascript">
        alert('@Datetime.ToString()');
        </script>
        

        【讨论】:

          【解决方案7】:

          如果您的目标是根据用户角色应用/触发有效的 JS 代码,那么您可以执行以下操作:

          1. Views/Shared/js 文件夹中创建局部视图。

            这里的 js 文件夹是我手动创建的。你可以给任何名字。

          2. 然后添加带有前缀_符号的布局页面(部分视图)。

            我在这里创建 _mypageScrtipts.cshtml

          3. 将你的JS文件代码移动到_mypageScrtipts.cshtml中,并根据它放置角色条件和触发JS代码。

          示例:

          @{var role = User.Identity.GetRole();} //came from "AspNetRoles" table
          
          @if(role=="Admin") 
          {
            <script> alert("I am admin user."); </script>
          }
          else
          {
            <script>alert("I am normal user.");</script>
          }
          

          【讨论】:

            猜你喜欢
            • 2012-05-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-30
            • 1970-01-01
            • 1970-01-01
            • 2020-04-17
            相关资源
            最近更新 更多