【问题标题】:MVC "~" path in javascriptjavascript中的MVC“〜”路径
【发布时间】:2013-04-21 10:32:57
【问题描述】:

我使用 JavaScript 代码调用 MVC Web API。当前路径为:

http://localhost/myApp/Administrator

但当当前路径为时失败:

http://localhost/myApp/Administrator/

我收到错误 The resource cannot be found。下面是代码:

$.getJSON("api/UserApi",
    function (data) {
        ...               
    });

我不想在代码中使用绝对 URL,例如:

$.getJSON("http://localhost/myApp/api/UserApi",          
    function (data) {
        ...    
    });

绝对 URL 可以正常工作,但缺乏灵活性。有没有办法做下面同样的事情?

$.getJSON("~/api/UserApi",          
    function (data) {
        ...
    });

ASP.NET 支持将“~”字符替换为当前应用程序的根路径,例如:

http://localhost/myApp

但是,JavaScript 文件不支持“~”字符。我如何完成同样的事情?

JavaScript 位于一个独立文件中,无法使用像 Url.Content 这样的 ASP.NET 语句。有没有更好的方法?

我找到了以下方法。有没有更好的解决方案?:

1) 将以下代码写入 .cshtml 文件中

<script type="text/javascript"> 
    var currentDomain = '@Url.Content("~")';
</script>

2) 从 .js 文件中读取currentDomain 变量:

$.getJSON(currentDomain + "/api/UserApi",          
    function (data) {
        ...        
});

【问题讨论】:

    标签: javascript asp.net path relative-path


    【解决方案1】:

    在视图集页面Url中:

    <script type="text/javascript">
        var PageUrl = '@Url.Action("Index","Home")';
    </script>
    

    然后在一个js文件中:

    function MyFunc() {
    var $form = $('form[id="Form"]');
        $.ajax({
        type: 'GET',
        url: PageUrl+"/MyActionName",
        data: $form.serialize(),
        cache: false,
        error: function (xhr, status, error) {
    
        },
        success: function (result) {
            //do something
        }
    });
    

    }

    【讨论】:

      【解决方案2】:

      如果您尝试获取某个操作的链接,您可以在视图中定义 JavaScript 变量,这些变量将填充 Url.Action

      <script type="text/javascript">
          var userApiPath = '@(Url.Action("userApi", "api"))';
      </script>
      

      然后在你的 JS 文件中使用这个变量:

      $.getJSON(userApiPath,          
          function (data) {
      });
      

      如果您想要应用程序的一般路径,可以执行以下操作:

      <script type="text/javascript">
          var path = '@(string.Format("{0}://{1}{2}",
                      Request.Url.Scheme,
                      Request.Url.Host,
                      (Request.Url.IsDefaultPort) ? "" : string.Format(":{0}",
                      Request.Url.Port)))';
      </script>
      

      稍后在您的 JS 文件中的某处使用此变量。当然,您不必使用string.Format 来执行此操作,这只是一个示例。

      编辑:

      您也可以考虑使用RazorJS

      【讨论】:

        【解决方案3】:

        你试过URL helper吗?它允许您为您的控制器/操作生成一个完全限定的 URL,如下所示:

        @Url.Action("Index", "Home", etc...)
        

        参考:MSDN

        更新
        我注意到您指的是将动态 URL 写入您的 .js 文件。您不应该将 URL 硬编码到您的脚本中,这会使您的代码更难维护。如果您明天更改域并忘记更改其中一个脚本文件中的 URL 怎么办?您应该将 URL 作为参数从您的 .cshtml 页面传递给您的 JS 函数。

        【讨论】:

        • 是的,我不想将域名硬编码到 .js 文件中,所以我想找到一种类似于 CSHTML 文件中的 '~' 字符的方法,可以自动替换 '~ ' char 到当前域,在 JS 文件中似乎没有办法做到这一点,所以我想我现在必须从 CSHtml 文件中获取当前域名,然后将其传递给 js 文件。
        【解决方案4】:
        @Url.Action
        

        对于 Javascript

        @Url.Content
        

        用于 CSS 和 JS 文件添加。

        【讨论】:

        • javascript在一个独立的文件中,不能使用asp.net语句,有更好的方法吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多