2010-01-07 5 views
2

J'ai une fonction JSONResult MVC ASP.Net dans laquelle je veux retourner le contenu d'un PartialView (Le contenu doit être chargé en utilisant Ajax, et pour une raison que je ne peux pas retourne un PartialViewResult).Obtenir le ViewContext actuel dans ASP.Net MVC

Pour rendre le PartialView j'ai besoin de l'objet ViewContext.

Comment obtenez-vous l'objet ViewContext actuel dans une méthode Action? Je ne vois même pas HttpContext.Current dans ma méthode d'action.

J'utilise ASP.net MVC 1.

Répondre

4

Un ViewContext n'est pas disponible dans la méthode d'action car il est construit plus tard avant le rendu de la vue. Je vous suggère d'utiliser MVCContrib's BlockRenderer pour afficher le contenu d'une vue partielle dans une chaîne.

+0

C'est exactement ce dont j'avais besoin. Maintenant, essayant d'aller le faire fonctionner. Merci Darin. –

+0

Je suis évidemment manquer le besoin de ceci, quelqu'un serait assez aimable pour me donner un exemple d'où cela serait nécessaire? – Lazarus

+0

http://thriftybliss.spaces.live.com/blog/cns!58DA805F37F31F20!170.entry?wa=wsignin1.0&sa=362921628 Mais c'était plus rapide et plus facile pour moi. –

0

j'ai manqué un point quelque part, mais mes actions qui sont revenus des vues partielles faire en retournant un objet View qui fait référence à une page ascx. Cela renverra le HTML partiel sans les constructions complètes de la page (html, head, body, etc.). Vous ne savez pas pourquoi vous voudriez faire autre chose, y a-t-il une raison particulière pour laquelle vous devez retourner PartialViewResult? Voici un exemple de mon code de travail.

D'abord l'action dans mon contrôleur:

public ViewResult GetPrincipleList(string id) 
    { 
     if (id.Length > 1) 
      id = id.Substring(0, 1); 
     var Principles = competitorRepository.Principles.Where(p => p.NaturalKey.StartsWith(id)).Select(p=>p); 
     return View(Principles); 
    } 

Et puis la vue partielle (ascx):

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<MyProject.Data.Principle>>" %> 
    <% foreach (var item in Model) { %> 
<div class="principleTitle" title="<%= Html.Encode(item.NaturalKey) %>"><%= Html.Encode(item.Title) %></div> 
<%} %> 

Enfin, le Jquery qui met en place l'appel:

$(function() { 
     $(".letterSelector").click(function() { 
      $("#principleList").load("/GetPrincipleList/" + $(this).attr("title"), null, setListClicks); 
     }); 
    }); 

Donc, un processus AJAX complet, espérons que cela aide.

---- ---- ACTUALISATION commentaire suivant

De retour des données JSON est tout aussi simple:

Tout d'abord, lancer l'appel AJAX lors d'un changement de boîte de sélection:

$("#users").change(function() { 
     var url = "/Series/GetUserInfo/" + $("#users option:selected").attr("value"); 
     $.post(url, null, function(data) { UpdateDisplay(data); }, 'json'); 
    }); 

le javascript qui traite les données JSON retournée:

function UpdateDisplay(data) { 
    if (data != null) { 
     $("div.Message").fadeOut("slow", function() { $("div.Message").remove(); }); 
     $("#Firstname").val(data.Firstname); 
     $("#Lastname").val(data.Lastname); 
     $("#List").val(data.List); 
     $("#Biography").val(data.Biography); 
     if (data.ImageID == null) { 
      $("#Photo").attr({ src: "/Content/Images/nophoto.png" }); 
      $("#ImageID").val(""); 
     } 
     else { 
      if (data.Image.OnDisk) { 
       $("#Photo").attr({ src: data.Image.ImagePath }); 
      } 
      else { 
       $("#Photo").attr({ src: "/Series/GetImage?ImageID=" + data.ImageID }); 
      } 
      $("#ImageID").val(data.ImageID); 
     } 
     $("form[action*='UpdateUser']").show(); 
    } else { 
     $("form[action*='UpdateUser']").hide(); 
    } 
}; 

Et enfin A ction lui-même qui renvoie les données json:

public JsonResult GetUserInfo(Guid id) 
    { 
     MyUser myuser = (from u in seriesRepository.Users 
         where u.LoginID == id 
         select u).FirstOrDefault(); 
     if (myuser == null) 
     { 
      myuser = new MyUser(); 
      myuser.UserID = 0; 
      myuser.Firstname = Membership.GetUser(id).UserName; 
      myuser.Lastname = ""; 
      myuser.List = ""; 
      myuser.Biography = "No yet completed"; 
      myuser.LoginID = id; 
     } 
     return Json(myuser); 
    } 

Cela aide-t-il? Sinon, pouvez-vous poster une partie du code sur lequel vous travaillez car il me manque quelque chose?

+0

Lazarus, je veux retourner un JSONResult parce que les données que je renvoie par l'intermédiaire d'Ajax ont des éléments qui doivent être traités en utilisant Javascript au niveau du client. Je ne veux pas appeler deux fonctions distinctes pour le JSon et le Partial, donc je veux rendre le partial comme un json val. –

+1

JsonResult jsn = Json (nouveau dictionnaire {{"succès", true}, {"lastPID", messages [0] .ID}, {"content", Globals.RenderPartialToString ("~/Views /Partial/Posts.ascx",ViewData,this.ControllerContext, TempData)}}); –

+0

Ah! Je vois pourquoi tu as besoin de ça. – Lazarus

Questions connexes