使用ASP.NET MVC和JQuery时避免硬编码URL的最佳方法是什么?

5

大家好,

我正在使用ASP.NET MVC和jquery,目前进展顺利。只有一个问题一直困扰着我:在jquery方法中如何处理url?我真的不想像这样硬编码:

 $(function() {  
        $.getJSON("/Home/List", function(data) {  
            var items = "---------------------";  
            $.each(data, function(i, country) {  
                items += "" + country.Text + "";  
            });  
            $("#Countries").html(items);  
        });  

       $("#Countries").change(function() {  
           $.getJSON("/Home/States/List/" + $("#Countries > option:selected").attr("value"), function(data) {  
               var items = "---------------------";  
               $.each(data, function(i, state) {  
                   items += "" + state.Text + "";  
               });  
               $("#States").html(items);  
           });  
       });  
   });  

强烈建议在MVC中使用HTML助手方法来创建链接,例如Html.ActionLink、Html.BeginForm。这样,如果有人将HomeController映射到MyHome而不是Home,就不会出现问题。
那么,如何避免像示例中一样硬编码URL呢?
另外,我不想使用ASP.NET Ajax,因为我同意asp-net-ajax-vs-jquery-in-asp-net-mvc中的回答。
谢谢
3个回答

6
您可以定义多个全局JavaScript变量:
<script type="text/javascript">
    var listUrl = '<%= Url.Action("Index", "Home") %>';
    var statesListUrl = '<%= Url.Action("States", "Home") %>';
</script>

这将会被$.getJSON方法后续使用。


也许你应该避免使用全局作用域,最好将它们命名空间化,例如:ajaxUrlStack.myurl1 ... - umpirsky

1
我一直在使用一种非常简单和实用的方法,就是在每个主页面的顶部放置类似于这样的内容:
<script type="text/javascript">
    var baseUrl = '<%= Url.Resolve("~") %>';
</script>

然后在之后包含所有的 JavaScript 文件,使用 baseUrl 每当需要时。


谢谢您的回复,Mookid。这确实是我需要应用的好建议。但对我来说更重要的是如何避免硬编码URL本身,例如Home/Index; Product/ShowAll等等... - Misha N.

1

我经常只需要在js中获取当前的控制器和操作。这就是为什么我将其包含在我的MasterPage中的原因。

<script type="text/javascript">
  var controller = '';
  var action = '';
  controller =   '<%= ViewContext.RouteData.GetRequiredString("controller")%>' ;
  action =   '<%= ViewContext.RouteData.GetRequiredString("action")%>' ;
    </script>

这是一个很棒的技巧,一直在尝试找到一种从jQuery获取控制器名称的方法。 - jaekie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接