3

Je rends une vue avec une table dedans. Chaque ligne de la table est un objet qui pourrait être édité. Donc, la dernière colonne de cette table a un tas de boutons "EDIT". Lorsque l'un de ces boutons EDIT est cliqué, la fonction JavaScript doit récupérer l'identifiant de l'objet représenté par la ligne en cours. En fin de compte, je voudrais finir avec un HTML propre: pas d'attributs "onclick", "onmouseover" et pas d'attributs personnalisés. Ci-dessous, j'ai 2 exemples dont je ne suis pas ravi. Des bonnes idées?Meilleure façon de passer des paramètres d'objets serveur à JavaScript

Exemple 1:

View.aspx

<td> 
    <input type="button" value="EDIT" onclick="JSFunction(<%: ObjectId %>)" /> 
</td> 

JavaScript

function JSFunction(id) 
{ 
    //some code that does whatever with id 
} 

Exemple 2:

View.aspx

<td> 
    <input type="button" value="EDIT" customAttribute="<%: ObjectId %>" /> 
</td> 

JavaScript

$('input[type=button]').click(function() { 
    var id = this.attr('customAttribute'); 
    //some code that does whatever with id 
}); 

post-scriptum Si vous pouviez trouver un meilleur titre de question, s'il vous plaît partager aussi bien :)

+0

Où voulez-vous que les données customAttribute soient stockées?Une fois que nous savons où il est, nous pouvons comprendre comment y accéder avec jQuery. Ou voulez-vous que les données soient stockées côté serveur et vous l'obtenez avec AJAX? – mrtsherman

+0

Les attributs personnalisés peuvent être considérés comme html propre. Ils sont même dans la spécification HTML5 http://dev.w3.org/html5/spec/Overview.html#embedding-custom-non-visible-data-with-the-data-attributes – Vadim

+0

@mrtsherman - Je le veux pour être rendu dans le côté serveur HTML, alors chez le client, JavaScript pourrait saisir cette valeur. – Dimskiy

Répondre

6

Une façon dont j'ai géré ceci dans le passé est d'utiliser l'attribut de données html5. Qui est repris par les versions de jQuery 1.4.3 et ci-dessus.

<table> 
    <tr class="row" data-rowInfo='{"Id": "1", "Name": "Jon"}'> 
     <td> 
      Row Id 1 
     </td> 
     <td> 
      <input type="button" value="Edit"/> 
     </td> 
    </tr> 
    <tr class="row" data-rowInfo='{"Id": "2", "Name": "Mark"}'> 
     <td> 
      Row Id 2 
     </td> 
     <td> 
      <input type="button" value="Edit"/> 
     </td> 
    </tr> 
    <tfoot> 
     <tr> 
      <td></td> 
     </tr> 
    </tfoot> 
</table> 

Ensuite, dans votre jquery vous pouvez effectuer les opérations suivantes:

$("input[type=button]").click(function(){ 
    var rowInfo = $(this).parents("tr.row").data("rowInfo"); 
    //Do something with rowInfo.Id; 
}); 

En utilisant les données des attributs que vous pouvez avoir un riche objet JSON qui pourrait contenir plus d'informations qu'un simple attribut. De plus, vous n'avez qu'à déclarer un attribut de données pour contenir toutes les informations pertinentes. Exemple de ceci travaillant sur jsfiddle.

+0

J'étais en train de jouer avec un attribut de données auparavant, mais seulement à l'intérieur de JavaScript. Est-ce la bonne façon de le construire en HTML/aspx? Si je FireBug cet élément, vais-je voir ce que cet attribut de données contient? – Dimskiy

+0

+1 J'étais sur le point de répondre à quelque chose comme ça mais vous m'avez battu juste et carré :) – jimmystormig

+0

@Dimskiy Je pense que vous pouvez inspecter l'élément de données avec Firebug en utilisant https://addons.mozilla.org/fr-fr/firefox/addon/firequery/ – jimmystormig

1

La façon dont je le fais est que j'ai le serveur rendre l'id à la balise <tr>, vous pouvez soit créer votre propre attribut ou le stocker dans l'attribut id. Ensuite, si vous avez un bouton d'édition à l'intérieur d'un td, vous écrivez juste jQuery pour trouver l'identifiant stocké dans la balise <tr>.

html:

<tr myId="1"> 
<td> 
    <input type="button" value="EDIT" /> 
</td> 
</tr> 

jQuery:

$(function() { 
     $("input[type=button]").click(function() { 
      var id = $(this).parent().attr("myId"); 
     }); 
    }); 

Bien que j'assigner généralement une classe de « modifier » à mes boutons d'édition plutôt que de les sélectionner par leur type (comme je l'ai un bouton de sauvegarde sur la page).

+0

Merci! Je vais aussi avec des cours. Je ne l'ai pas posté ici pour plus de simplicité. Alors, que feriez-vous s'il y a plus d'un paramètre? Collez-les dans une chaîne et analyser JavaScript en fonction du caractère séparateur? Serveur: <%: Id + "|" + OtherParam%> – Dimskiy

+0

@Dimskiy, S'il y a plus d'un paramètre j'irais avec Marks answer. –

0

Je voudrais utiliser le plugin de métadonnées jQuery car les données peuvent être intégrées de différentes manières sur n'importe quel élément. La manière habituelle est de l'ajouter à la classe comme ceci:

<input type="button" class="button { objectId : <%: ObjectId %> }" /> 
+0

J'essaie généralement de ne pas utiliser de plugins, sauf si j'ai vraiment l'impression d'en avoir besoin. Par exemple, j'utiliserais définitivement jQuery UI DatePicker au lieu d'en implémenter un moi-même. Merci pour la suggestion si! – Dimskiy

Questions connexes