2010-10-29 5 views
1

J'essaie de comprendre comment passer l'objet modèle de contrôleur pour afficher dans un scénario suivant:MVC modèle d'objet passe du contrôleur pour voir

<% Html.Action("GetRequest", "The_Controller", new { requestId = 12 }); %> 
<% Html.RenderPartial("Request", ViewData.Model); %> 

L'action devrait, et il le fait, appeler le contrôleur de méthode qui recherche l'objet Request dans le référentiel DB et renvoie un objet Request.

La vue partielle appelée Request doit recevoir l'objet de requête et l'afficher.

Le problème est que le ViewData.Model est toujours nul ?!

J'ai essayé de le comprendre, mais sans succès :(

La raison de ce comportement est que je dois afficher une vue partielle à l'intérieur de dialogue modale basée sur la valeur requestId du jQuery fourni par le jqGrid . Je suis arrivé au point où j'ouvre la boîte de dialogue mais ne peut pas obtenir cette instance de l'objet modèle

Toute aide est appréciée

la solution -.. Avec l'aide de Nick Larsen et Darin Dimitrov

Le contrôleur:

[AcceptVerbs(HttpVerbs.Post)] 
    [Authorize] 
    public PartialViewResult GetRequest(string requestId) 
    { 
     Request request = DatabaseContext.GetRequest(Convert.ToInt32(requestId)) as Request; 
     return PartialView("Request", request); 
    } 

Javascript de la vue:

function OpenRequest(requestId) { 

     var methodName = '<%= Url.Content("~")%>' + 'Controller/GetRequest/'; 
     var dataType = "html"; 
     var postData = { requestId: requestId }; 
     var contentType = "application/x-www-form-urlencoded"; ; 
     var request = ContactServer(methodName, postData, dataType, contentType); 

     $("#dialog").html(request); 
     $("#dialog").dialog({ html: request, title: 'Request details...', width: 800, height: 600, modal: true, zindex: 300000, show: 'scale', resizable: false }); 

    } 

Répondre

1

Il est préférable de le configurer où votre vue ne remet pas votre contrôleur. Chargez toutes les données de la requête dans l'action qui appelle cette vue et remplissez un modèle de vue avec les données nécessaires. Une fois que vous avez cela, restituez les champs du modèle.

En ce qui concerne votre problème réel. L'action qui appelle cette vue en premier lieu remplit le ViewData.Model pour son contexte. Lorsque vous appelez la méthode d'action, le framework crée un nouveau contexte avec son propre ViewData auquel vous n'avez pas accès sans un handle pour ce nouveau contexte.

+0

Je vois votre point, cependant la vue initiale affiche le jQGrid, par conséquent je ne peux pas charger toutes les demandes. L'exemple de code utilisait une valeur codée en dur, c'est-à-dire requestId = 12. En réalité, la valeur va être transmise via l'événement double-clic de jQGrid, qui ouvrira à son tour un dialogue modal, qui sera à son tour injecté avec l'instruction <% RenderPartial ...%>, qui devrait afficher les données désirées dans un dialogue modal. Mon problème tourne autour de comment passer un objet d'un contrôleur à la vue partielle d'une manière dynamique :) – bignermo

+0

Oh, j'ai oublié, y at-il un moyen d'accéder à ce handle nouvellement créé? – bignermo

+0

Il est probablement mais vous ne devriez probablement pas. Si vous utilisez jQGrid, chargez les données du client sur 'jQuery(). Ready (...);'. Vous n'avez alors plus besoin d'utiliser cette méthode. Voici une tonne d'exemples: http://www.trirand.com/blog/jqgrid/jqgrid.html –

1

Il semble que vous ayez toutes les informations nécessaires, au départ, pour créer un objet 'Request' dans votre méthode d'action initiale du contrôleur.

Suggérer que:

  • tomber la <% Html.Action("GetRequest", "The_Controller", new { requestId = 12 }); %> tout à fait. Nous allons préremplir ViewData avec toutes les données nécessaires pour envoyer au Partiel.

  • dans votre méthode de commande initiale, vous créez une nouvelle entrée ViewData, peut-être ViewData["SomeRequest"]

  • préremplir que vous avez besoin sur la méthode de commande initiale, en utilisant requestId = 12 et email = "[email protected]", et tous les autres éléments pertinents pour créer un Objet 'Request', ou tout ce qui est nécessaire dans la vue partielle nommée 'Request'.

    c.-à-d.ViewData["SomeRequest"]= dbRepository.GetRequestById(intrequestId);

  • dans votre vue, appelez Html.RenderPartial("Request", ViewData["SomeRequest"]);

+0

Bonjour, j'ai changé l'appel à RenderPartial mais ViewData ["SomeRequest"] est toujours nul. Cependant, l'appel <% Html.Action ("GetRequest", "The_Controller", new {requestId = 12}); %> appelle le contrôleur où j'ai défini ViewData ["SomeRequest"] = dbRepository.GetRequestById (intrequestId); Le contrôleur remplit la ViewData mais à ce moment là où je dois appeler RenderPartial c'est null :( – bignermo

+0

Salut, votre solution fonctionne mais la réponse est partiellement acceptable parce que le scénario est de nature dynamique Une fois que j'ai défini ViewData avec la vue initiale , il est défini sur une requête d'un Id particulier, ce qui signifie qu'il reste statique.Ce dont j'ai besoin est la façon de récupérer l'objet de manière dynamique, à savoir quand un utilisateur clique deux fois sur une ligne jqGrid, le requestId change et c'est J'appelais la méthode Action.L'ID de 12 était juste une valeur de démo, qui sera remplacée par une variable – bignermo

+0

Cependant, une chose me vient à l'esprit ... Je vais essayer d'avoir un événement double-jick de jqGrid pour appeler le contrôleur et régler la variable ViewData, qui, je suppose, devrait être disponible pour passer à la vue partielle, je posterai les résultats demain – bignermo

2

Vous pourriez avoir l'action du contrôleur renvoie la vue partielle:

<%= Html.Action("GetRequest", "The_Controller", new { requestId = 12 }) %> 

Et dans votre action de contrôleur:

public ActionResult GetRequest(int requestId) 
{ 
    var request = _repository.GetRequest(requestId); 
    return PartialView("Request", request); 
} 

De cette façon, l'action GetRequest passera l'objet de requête à la vue partielle fortement typée Request.ascx et l'incluera dans la page à l'endroit que vous avez appelé Html.Action helper.

+0

Merci mec, le conseil a beaucoup aidé :) – bignermo

Questions connexes