【问题标题】:Better solution to using Url.Action in javascript code在 javascript 代码中使用 Url.Action 的更好解决方案
【发布时间】:2011-01-24 11:42:43
【问题描述】:

在我当前使用 asp.net MVC 3(使用 razor)的项目中,当我进行 Ajax 调用时,我必须将 JS 保留在视图页面上,因为我想使用 Url.Action 来生成 URL。这意味着我无法将 js 代码拆分为 .JS 文件,有没有比我目前正在做的更好的解决方案。

【问题讨论】:

  • Simon,我最近回答了这个问题,但实际上发现接受的答案是一个更简洁的解决方案。在这里查看一个很好的简单解决方案来解决您的问题:stackoverflow.com/questions/4624626/…欢呼..

标签: javascript asp.net asp.net-mvc


【解决方案1】:

我倾向于以与上述类似的方式完成此操作,但略有不同,因为我喜欢为我的 javascript 命名空间。

javascript 文件类似于:

var my = {};

my.viewname = 
{
   init : function(settings){
      // do some work here. settings.someImportantUrl has my json/ajax url eg.
      alert(settings.someImportantUrl );
   }
}

然后我的视图将包含类似的内容:

<script language='javascript'>
  // allocate an object with variables you want to use in the external js file
  var settings = {someImportantUrl: '<%=Url.Action(...)%>'};
  // call an init method for the current view
  my.viewname.init(settings);
</script>

【讨论】:

  • 所以 jamiec,要再次将 URL 从 JS 中提取出来,我只需使用 var url = my.namespace.settings.UserEditUrl 之类的 JS 对象表示法,这样是否正确?
  • @Simon - 在init 方法中,您可以使用 settings.whatever 访问您在视图中分配给设置对象的变量。重读示例,应该清楚了。
  • jamie,只是为了添加,您当然会将 var my = {}; 添加到您的初始 javascript 文件部分:-)
  • 认为我会接受你的建议 Jamie,不过还有一个题外话问题,为什么要为你的 JS 命名空间,这会带来什么,干杯
  • @Simon - 命名空间给任何编程带来的东西都是一样的;组织、清晰和良好实践。
【解决方案2】:

您只能在视图中定义 url,并将所有其他 javascript 代码保留在 .js 文件中。

在我的 MVC.NET 1 应用程序中有代码:

<script type="text/javascript" src="<%=Url.Content("~/Scripts/Account/ManageUsers.js")%>"></script>

<script type="text/javascript" src="<%=Url.Content("~/Scripts/Account/ManageUsersAndGroups.js")%>"></script>

<script type="text/javascript">

    var getUsersUrl = '<%= Url.Action("GetUsers", "Account") %>';
    var getUserDetailsURL = '<%= Url.Action("GetUserDetails", "Account") %>';

    <%If Not ViewData("readOnly") Then%>
    var changeRolePermissionsUrl = '<%= Url.Action("ChangeRolePermissions", "Account") %>';
    var deleteUserUrl = '<%= Url.Action("DeleteUser", "Account") %>';
    var resetPasswordUrl = '<%= Url.Action("ResetPassword", "Account") %>';
    var updateUserGroupsUrl = '<%= Url.Action("UpdateUserGroups", "Account") %>';
    var updateUserDetailsUrl = '<%= Url.Action("UpdateUserDetails", "Account") %>';
    <%End If%>  
</script>

因此,出于安全原因,您甚至可以不为用户无法调用的操作呈现 url。 (ViewData("readOnly") 表示用户对屏幕具有只读权限)。

而且js文件中有一段代码:

function GetUsersList() {
    ajax.getJSON(getUsersUrl, {}, function(data) {
        if (data != false) {
            ShowUsers(data);
        }
        else {
            jAlert('Error during users list retrieving.');
        }
    });
}

getUsersUrl 在 View 中定义

【讨论】:

  • 我在考虑这些思路,即将我所有 Ajax url 的集合保存在一个共享的 ascx 中并维护它,我只是想确保我不会错过其他可能更容易的东西
  • 我没有看到更好的方法。但我可以说我的练习很好。在一个大项目中使用了大约1.5年,我们在开发和维护方面没有任何问题。
  • 这是我得到的最佳解决方案。谢谢@Egor4eg
【解决方案3】:

您的 javascript 代码应位于单独的 javascript 文件中。您可以使用全局变量来链接您的视图和 javascript。例如。查看页面如下所示。

view html ...
<script type="text/javascript">
var pageUrl = @GetURL()
</script>

<script type="text/javascript" src="/js/script.js"/>

script.js 文件使用pageUrl 变量和其他全局变量。

【讨论】:

  • 但是我仍然需要在 JS 文件中硬编码 URL 路径,我不想这样做我希望 MVC 为我创建 URL。
  • @Simon 不,由于视图中定义了由 MVC 生成的全局变量,因此您不需要在 js 中硬编码路径
  • 啊好的,Adeel,你的建议类似于下面的 Egor4eg 答案。
【解决方案4】:

我不确定这对安全性的影响,但另一种方法是使用 @Url.Action 设置 html 标记的“id”,然后您可以创建一个 javascript 点击函数,例如以下:

查看

<div class="someClickable" id='@Url.Action("Action", "Controller")'>
</div>

引用的 javascript 文件

$(function() {
    $('someClickable').click(function () {
        $.ajax({
            url: this.id,
            success: someJSFunction,
            dataType: "html"
        });
    });
});

您最终会得到存储在 'div' 的 'id' 中的所需 url。只要您执行只读操作,这似乎是一个合理的解决方案。

【讨论】:

    猜你喜欢
    • 2012-04-06
    • 2013-04-30
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多