外部js文件中的Asp.Net Mvc Url.Action?

IT技术 javascript asp.net-mvc
2021-03-02 07:36:07

在外部js文件中,我不能使用

url = "@Url.Action("Action", "Controller")" 
//url output : @Url.Action("Action", "Controller")
//I get IllegalPath Name error.

当我这样写时:

url = "/Controller/Action"

如果项目在子文件夹下,则脚本不起作用。我需要这样的东西作为相对网址:

url = "~/Controller/Action"

我怎样才能做到这一点?谢谢。

5个回答

由于 .js 文件不会被 asp.net mvc 视图引擎解析,因此您根本无法在其中使用任何 c# 代码。我建议使用不显眼的方法,像这样

<div id="loader" data-request-url="@Url.Action("Action", "Controller")"></div>

而在javascript中,使用值 data-request-url

$(function(){
   $('#loader').click(function(){
       var url = $(this).data('request-url');
       alert(url);
   });
});
从 2019 年起竖起大拇指!
2021-04-17 07:36:07
提示顶部 - 谢谢。事后完全有道理。是时候将大量 JQUEry 转为外部脚本了。再次感谢!
2021-04-18 07:36:07
非常优雅的解决方案。谢谢!
2021-04-22 07:36:07
谢谢,当我在网站下创建 Web 应用程序时,这似乎有帮助。好方法而不是硬编码
2021-05-02 07:36:07
8年前,有人像往常一样优雅地处理了这件事
2021-05-14 07:36:07

我不确定这是否是最优雅的解决方案,但我所做的是区分寄存器和外部脚本中的实际实现,以便:

<script>...</script>
... include all the external scripts I need

$(document).ready(function(){

    //get all the information you need from your MVC context 
    //before going out of context and into the scripts
    var url = '@Url.Action("Action", "Controller")'; 


     RegisterMyFunction(url, other parameters ..);
     RegisterAnotherFunction(url, others...);
}

所以在我看来,我只有寄存器函数,脚本包含特殊值作为参数来做我想做的任何事情。

希望能帮助到你,

我会将周围的引号设为单引号',因此它们在视觉上与Url.Action方法的引号不同无论如何,这样的事情将是要走的路(+1)
2021-05-08 07:36:07
@Chips_100 谢谢伙计,你说得对,我修复了代码以提高可读性。
2021-05-10 07:36:07

这是我一直在使用的模式。这是更多的步骤,但我喜欢我的所有网址都在视图中的一个有组织的位置。

在我的视图底部,我将包含一个包含 url 的脚本部分,如下所示:

@section Scripts
{
    <script type="text/javascript">
        myJavaScriptObject.firstUrl = '@Url.Action("Action1", "Controller", new {id = Model.Id})';
        myJavaScriptObject.secondUrl = '@Url.Action("Action2", "Controller", new {id = Model.Id})';
    </script>
}

在我的 JavaScript 类(位于外部文件中)中,我将像这样引用 url:

var myJavaScriptObject = {
    firstUrl: '',
    secondUrl: '',
    docReady: function() {
        $.get(myJavaScriptObject.firstUrl, function(data) { do something...  });
    }
}

我意识到不需要在 Class 内部引用这些条目,但我喜欢将它们放在那里以供我自己整理。

正如已接受的答案所述,您不能在外部 JS 文件中使用任何 C# 代码。如果我需要将几个控制器链接传递给我的外部 .js 文件,我通常会这样做。

在 C# (.cshtml) 中

<script src="~/js/myfile.js"></script>

<script type="text/javascript">

    var url1 =  "@Url.Action("ActionName", "ControllerName", new { Param = ViewBag.Param })";  
    var url2 = "@Url.Action("AnotherAction", "AnotherController")";

    $(function() {
        window.initScript(url1, url2);
    });

</script>

在 myfile.js 中

var _url1;
var _url2;

function initScript(url1, url2) {
    _url1 = url1;
    _url2 = url2;

   // other init. codes...

}

您可以使用隐藏字段执行相同操作(在主视图/个人视图上)。

查看页面:

@Html.Hidden("commonUrlTrack", Url.Action("Action_Method_Name", "Controller_Name"))

<button onclick="commonFunction()">Click Me</button>

JS文件:

function commonFunction() {
    var url = $("#commonUrlTrack").val();        
    alert(url);        
}