Meilleure solution pour utiliser L'Url.Action en code javascript

dans mon projet actuel en utilisant asp.net MVC 3 (utilisant razor), quand je fais des appels Ajax, je dois garder le JS sur la page de vue parce que je veux utiliser L'Url.Action pour générer L'URL. Ça veut dire que je ne peux pas partager le code js .Js files, y a-t-il une meilleure solution que ce que je fais actuellement?

23
demandé sur tjdecke 2011-01-24 14:42:43

4 réponses

j'ai tendance à accomplir la même manière que ci-dessus, avec une légère touche différente, comme j'aime namespacing mon javascript.

Le fichier javascript ressemble à quelque chose comme:

var my = {};

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

Alors mon point de vue devrait contenir quelque chose comme:

<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>
17
répondu Jamiec 2011-01-24 16:30:43

vous pouvez définir seulement les urls en vue et garder tout autre code javascript.js fichiers.

il y a du code de vue dans mon MVC.NET 1 application:

<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>

ainsi, vous pouvez même ne pas rendre d'urls pour des actions qui ne peuvent pas être invoquées par l'utilisateur pour des raisons de sécurité. (ViewData("readOnly") signifie que l'utilisateur n'a accès qu'en lecture à l'écran).

Et il y a une partie de code dans le fichier js:

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

getUsersUrl est défini en vue

10
répondu Egor4eg 2011-01-24 11:51:34

votre code javascript doit se trouver dans un fichier javascript séparé. vous pouvez utiliser des variables globales pour lier votre vue et javascript. Par exemple: la page de vue ressemble à ci-dessous.

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

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

script.js le fichier pageUrl variable et autres variables globales.

2
répondu Adeel 2011-01-24 12:12:04

Je ne suis pas sûr des ramifications de sécurité sur ceci, mais une autre façon de le faire serait d'utiliser l'Url@.Action pour définir l '"id" du markup html, alors vous pouvez créer une fonction de clic javascript, comme suit:

View

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

fichier javascript référencé

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

vous finissez avec l'url désirée stockée dans le 'id' du 'div'. Cela semble être une solution raisonnable tant que vous faites lire seulement action.

2
répondu scott-pascoe 2013-01-11 15:15:06