2009-11-14 5 views
5

J'essaie d'utiliser $ .getJSON de JQuery pour accéder aux données du modèle à partir du contrôleur, et créer un objet JSON dans le javascript à utiliser lorsque l'utilisateur ajoute et supprime des éléments de une liste. Tout JS est fait dans un fichier externe. L'accès au serveur pour les données du modèle est effectué une seule fois après le chargement initial de la page afin que je puisse obtenir la liste complète des options pour l'utilisateur à choisir. Après cela, l'utilisateur peut modifier la liste autant qu'il le souhaite (et l'objet JSON est mis à jour en conséquence), puis l'enregistrer (réécrit dans la base de données). Mais voici mon problème: Lors de l'utilisation de $ .getJSON, la méthode que j'ai besoin d'appeler dans le contrôleur a besoin d'un ID afin qu'il puisse rechercher la ressource dont je parle et récupérer la liste des options qui s'y rapportent à cette ressource particulière. Mais à partir d'un fichier JS externe, je ne sais pas comment faire passer cette identification au contrôleur. Il est construit dans le lien qui ouvre la page en premier lieu, et est assis dans l'URL, mais une fois la page chargée, je ne sais pas comment obtenir cet ID afin de le transmettre au contrôleur. J'ai collé une partie de mon code ci-dessous, parce que je sais que cela est source de confusion:Accès au modèle ASP.NET MVC Données du fichier Javascript externe

méthode Détails dans le contrôleur qui se charge d'abord une page (prend un resourceID pour savoir quoi charger):

public ActionResult Details(string resId) 
{ 
    //call base method 
    base.Details(resId, resourceType); 
    Evaluation eval = (Evaluation)this.Model; 
    ViewData.Model = eval; 
    return View("Index"); 
} 

Dans mon fichier JS externe, je fais ceci:

$.getJSON("/Evaluation/PopulateJournalOptions/" + id, populateJSON); 

Et dans le contrôleur, j'ai écrit une autre méthode appelée PopulateJournalOptions qui est appelée à construire l'objet JSON:

public JsonResult PopulateJournalOptions(string resId) 
{ 
    JournalOptionsResult jsonResult = new JournalOptionsResult(); 

    base.Details(resId, resourceType); 
    Evaluation eval = (Evaluation)this.Model; 

    jsonResult.Activities = eval.Journal.Activities; 
    jsonResult.Issues = eval.Journal.Issues; 
    jsonResult.ScheduledActions = eval.Journal.ScheduledActions; 

    return Json(jsonResult); 
} 

Encore une fois, mon problème est que, une fois la page chargée, je n'ai pas accès à l'ID que j'ai besoin de passer à PopulateJournalOptions. J'ai essayé de ne rien transmettre à PopulateJournalOptions, et de créer un nouvel objet là-bas et de lui donner la valeur (Evaluation)this.Model, mais this.Model semble être nul, probablement parce qu'il s'agit d'une nouvelle instance du contrôleur une fois qu'il est appelé depuis le JS. Donc je suis coincé ici. Des idées?

+0

avoir répondu à votre question ci-dessous et je vous suggère de faire un bon livre MVC (d'apress) et lire sur le cycle de vie de la demande. –

Répondre

5

Avez-vous pensé à mettre l'identifiant dans un champ caché sur la page et avoir votre javascript lire l'ID du champ?

$.getJSON("/Evaluation/PopulateJournalOptions/" + $('#Id').attr('value'), populateJSON); 

Alors, selon vous,

<%= Html.Hidden("Id") %> 

Avec votre modèle ayant le besoin Id comme une propriété

+0

Je n'y avais pas pensé, et c'est certainement une approche intéressante. Aussi simple que cela puisse paraître, j'ai l'impression que c'est une sorte de tricherie. Cela ressemble-t-il à quelqu'un d'autre? –

+0

Plus je pensais à cette méthode, plus elle commençait à paraître propre, alors je suis allé de l'avant et l'ai implémenté. Mais au lieu de .attr ('value'), j'avais besoin d'utiliser .html(). Sinon, ça fonctionne très bien. Merci pour la réponse! En note, je n'aime vraiment pas comment je frappe le serveur deux fois pour construire cet objet JSON (une fois pour charger la page et une autre pour appeler l'action du contrôleur pour retourner les données pour JSON). Ce serait génial si je pouvais obtenir ce JSON dans une variable javascript externe sur le chargement de la page, plutôt que d'avoir à revenir en arrière pour frapper le serveur une seconde fois. –

+0

Il n'y a aucune raison que vous ne puissiez pas mettre la valeur dans votre modèle, puis l'écrire dans une variable javascript dans la vue. L'utilisation d'un rappel AJAX accélère le chargement initial de la page, mais si vous pouvez vous permettre le temps, vous pouvez le mettre directement dans la vue. – tvanfosson

0

Mettre cela dans le contrôleur:

ViewData["resouceID"] = resouceID; 

Mettre cela dans la vue que les charges initialement:

<script> 
$(document).ready(function() { 
    $.getJSON("<%=Url.Action("YourActionName", "YourControllerName", new {id = ViewData["resouceID"]}) %>", populateJSON); 
}); 
</script> 
+0

Salut Josh, merci pour la réponse rapide. Pouvez-vous expliquer brièvement ce que cela fait? Il semble que je devrais encore fournir l'ID comme "yourID". J'ai testé mon code avec un identifiant codé en dur fourni à $ .getJSON et tout fonctionne, donc mes appels de contrôleur, callbacks, routage, etc fonctionnent bien, mais je ne sais pas comment faire passer l'identifiant. Je peux mal interpréter votre réponse, mais il semble que je doive encore fournir l'ID. Aussi, cela fonctionnera-t-il à partir d'un fichier JS externe? Merci encore. –

+0

J'ai édité ma réponse pour expliquer plus loin. –

+0

Si vous avez besoin d'obtenir l'identifiant à partir de l'adresse de la page sur le client, puis consultez le plugin de requête: http://plugins.jquery.com/project/query-object –

Questions connexes