2011-11-21 4 views
3

J'ai une aide html dans MVC3 qui rend une section personnalisée de html qui est utilisé comme un contrôle de recherche. Le problème est qu'il y a javascript (jquery) qui a été écrit pour interagir avec le contrôle (il devrait vraiment être utilisé juste pour ce contrôle). Existe-t-il un moyen de rendre le javascript intégré afin que le contrôle continue d'avoir la fonctionnalité javascript. (Avec la création de l'assistant, nous pouvons contrôler la structure du code HTML et faciliter l'écriture du javascript, ce qui standardiserait l'utilisation du contrôle sur l'ensemble de l'application).MVC3 html helpers et javascript

ex.

<div> 
@Html.SearchControl("searchControlSelector") 
</div> 

<script> 
    $("searchControlSelector").timeout(); 
<script> 

Je veux être en mesure de définir la fonctionnalité de « délai d'attente » lorsque vous appelez le @ Html.SearchControl ([quelques] params) de telle sorte que le javascript et aide sont combinés et les utilisateurs de l'aide n'ont pas à vous inquiéter à propos des sélecteurs qu'ils devraient utiliser lorsqu'ils appellent 'timeout'. Est-ce que quelqu'un sait comment y parvenir? Y a-t-il une meilleure façon de gérer cela?

Répondre

1

Il est difficile de rendre html helper complètement réutilisable avec un seul fichier javascript partagé.

Au début, il est impossible de diffuser un seul bloc de code <script>$(".searchControl").timeout()</script> par page sans utiliser la méthode supplémentaire appelle à la mise en page, etc.

Vous pouvez ajouter votre propre spécifique de contrôle des données attribut comme données recherche-contrôle et utilisez-le dans des sélecteurs comme $("input[data-search-control]").timeout() pour ne distinguer que du HTML produit par votre assistant.

Si vous avez plusieurs blocs de scripts à la page, n'oubliez pas qu'ils seront exécutés plusieurs fois, donc vous devez vous soucier d'éviter plusieurs exécutions. Vous pouvez associer certaines données à des noeuds HTML déjà traités par le script en utilisant par exemple la méthode jQuery $("").data(). Ou en option, vous pouvez vérifier si un objet spécifié dans la portée globale est déclaré et si c'est le cas, ne rien déclarer autrement et appeler votre méthode.

+0

J'ai ajouté l'attribut de données et l'ai connecté quand les applications ont démarré et que ça a marché! C'était une bonne idée. Merci! –

1

Lorsque je veux faire quelque chose comme ça, j'ai tendance à le garder aussi simple que possible. Voici un code qui semble correspondre à la facture.

using System; 
using System.Text; 
namespace MvcApplication1.Helpers 
{ 
    public class Html 
    { 
     public static string SearchControl(string selector) 
     { 
      StringBuilder returnString = new StringBuilder(); 
      //put your existing code here. 
      returnString.Append(String.Format("<label >{0}</label>", selector)); 
      //just add the JS as string, (wrapped in a 'ready' if you need that) 
      returnString.Append(String.Format("<script>$(function(){$(\"{0}\").timeout();});<script>", selector)); 
      return returnString.ToString(); 
     } 
    } 
} 

Si ce n'est pas utile, s'il vous plaît ajouter plus de description à votre question et nous allons essayer de vous aider.