为了账号安全,请及时绑定邮箱和手机立即绑定

@Url.Content("~/") 在 JavaScript 文件中不起作用?

@Url.Content("~/") 在 JavaScript 文件中不起作用?

C#
四季花海 2022-11-22 15:40:52

我有一个 ASP.NET CORE MVC 应用程序,我在我的一个视图中包含一个 JavaScript 文件。JavaScript 用于页面上的下拉菜单,调用控制器上的函数以获取下拉菜单的数据。


$(document).ready(function() {


    $('#accounts').change(function() {

        var url = '@Url.Content("~/")' + "GetMeters";

        var ddlsource = "#accounts";


        $.getJSON(url,

            { accountId: $(ddlsource).val() },

            function(data) {

                var items = '';

                $("#meters").empty();

                $.each(data,

                    function(i, meter) {

                        items += "<option value='" + meter.value + "'>" + meter.text + "</option>";

                    });

                $('#meters').html(items);

            });

    });


});

单步执行代码,我注意到在 'var url = '@Url.Content("~/")' + "GetMeters";' 之后 被执行时,'url' 被设置为“@Url.Content("~/")GetMeters”。


在 StackOverflow 上查看类似问题,所以我尝试只使用“~/GetMeters”,但它也不起作用。


如果 url 设置为“ https://localhost:44344/Meters/GetMeters ”,我在控制器上的功能将被正确调用。解决此问题的最佳方法是什么?谢谢!


查看完整描述

2 回答

?
繁花不似锦

TA贡献1570条经验 获得超4个赞

@Url.Content是一个 Razor 插值指令,只会在 Razor 视图或页面文件 ( .cshtml) 中被解析。没有其他东西通过 Razor 视图引擎,因此不能期望它在 CSHTML 文件以外的任何文件中工作。


有几种方法可以在页面加载时将服务器端数据传递给 JavaScript 文件——比 StackOverflow 答案中涵盖的更多。对于您的特定情况,您似乎只需要将 URL 根传递给脚本,以便它可以调用端点。如果可能的话,通常最好在服务器端完全呈现操作 URL,而不是在客户端构建它们。为此,您可以使用以下方法之一。


1. 从引用这个文件的视图中提供一个全局变量

SomeView.cshtml


<script>

window.Routes = {

    getMeters: '@Url.Action("GetMeters", "Meters")', // the GetMeters action on MetersController

    // add other routes here

};

</script>


<script src="@Url.Content("~/somescript.js")"></script>

一些脚本.js


$(document).ready(function() {

    var url = Routes.getMeters;

    // ...

});

2.让脚本公开一个函数并从视图中调用它

一些脚本.js


// This function replaces $(document).ready(...)

function initialize(getMetersRoute) {

    var url = getMetersRoute;

    // ...

}

SomeView.cshtml


<script src="@Url.Content("~/somescript.js")"></script>


<script>

$(document).ready(function() {

    initialize('@Url.Action("GetMeters", "Meters")');

});

</script>


查看完整回答
反对 回复 2022-11-22
?
慕姐4208626

TA贡献1556条经验 获得超7个赞

一种解决方案是在布局 cshtml 文件中创建一个包含您的 url 的变量,该文件在您使用 javascript 文件的任何地方使用,然后您可以简单地在 JS 文件中调用此变量。

例子 :

websiteUrl = '@Url.Content("~/")';

您只需要使用 websiteUrl。


查看完整回答
反对 回复 2022-11-22
  • 2 回答
  • 0 关注
  • 9 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信