Question

Je suis en train d'utiliser .getJSON $ de JQuery pour accéder aux données du modèle du contrôleur, et de construire un objet JSON dans le javascript pour utiliser que l'utilisateur ajoute et supprime les éléments d'une liste. Tout JS se fait dans un fichier externe. Le succès au serveur pour les données du modèle se fait qu'une seule fois après chargement de la page afin que je puisse obtenir la liste complète des options pour l'utilisateur de choisir. Après cela, l'utilisateur peut modifier la liste autant qu'il veut (et l'objet JSON est mis à jour en conséquence), puis enregistrez-le (il se réécrites à la DB).

Mais voici mon problème: Lorsque vous utilisez .getJSON $, la méthode que je besoin d'appeler le contrôleur a besoin d'un ID afin qu'il puisse regarder ce que ressource particulière dont je parle et retourner la liste des options qui se rapporte à cette ressource particulière. Mais à partir d'un fichier JS externe, je ne sais pas comment cet ID pour passer 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 que la page se charge, 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:

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, je l'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 que la page se charge, je n'ai pas accès à l'ID que je dois passer à PopulateJournalOptions. J'ai essayé tout simplement pas passer quoi que ce soit à PopulateJournalOptions, et la création d'un nouvel objet là-bas et le mettre égal à (Evaluation)this.Model, mais this.Model semble être nulle, sans doute parce qu'il est une nouvelle instance du contrôleur une fois qu'il est appelé à partir de la JS. Donc, je suis un peu coincé ici. Toutes les idées?

Était-ce utile?

La solution

Avez-vous pensé à mettre l'identifiant dans un champ caché sur la page, puis d'avoir votre javascript lu l'id du champ?

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

Alors, selon vous,

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

Avec votre modèle ayant la Id nécessaire comme une propriété

Autres conseils

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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top