views:

576

answers:

2

I have a ASP.Net MVC JsonResult function in which I want to return the contents of a PartialView (The content has to be loaded using Ajax, and for some reason I can't return a PartialViewResult).

To render the PartialView I need the ViewContext object.

How do you get the current ViewContext object within an Action method? I don't even see HttpContext.Current in my action method.

I am using ASP.net MVC 1.

A: 

I may have missed a point somewhere but my Actions that returned partial views do so by returning a View object that refers to an ascx page. This will return partial HTML without the full page constructs (html, head, body, etc.). Not sure why you'd want to do anything beyond that, is there a specific reason you need to return PartialViewResult? Here's an example from my working code.

First the Action in my controller:

    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);
    }

And then the partial view (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>
<%} %>

Lastly, the Jquery that sets up the call:

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

So, a full AJAX process, hope that helps.

---- UPDATE following comment ----

Returning Json data is just as easy:

Firstly, initiating the AJAX call when a select box changes:

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

The javascript that processes the returned json data:

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();
    }
};

And finally the Action itself that returns the json data:

    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);
    }

Does that help? If not then can you post some of the code you are working on as I'm missing something.

Lazarus
Lazarus, I want to return a JSONResult because the data I am returning through Ajax has some elements that need to be processed using Javascript at the client end. I don't want to call two separate functions for the JSon and the Partial, so I want to render the partial as a json val.
Cyril Gupta
JsonResult jsn = Json(new Dictionary<string, object> { { "success", true }, { "lastPID", posts[0].ID }, { "content", Globals.RenderPartialToString("~/Views/Partial/Posts.ascx",ViewData,this.ControllerContext,TempData) } });
Cyril Gupta
Ah! I see why you need that.
Lazarus
+2  A: 

a ViewContext is not available within the action method because it is constructed later before rendering the view. I would suggest you using MVCContrib's BlockRenderer to render the contents of a partial view into a string.

Darin Dimitrov
damn you. posted few seconds faster. :E
Arnis L.
This is exactly what I needed. Now trying to go get it to work. Thanks Darin.
Cyril Gupta
I'm obviously missing the need for this, would anyone be kind enough to give me an example of where this would be necessary?
Lazarus
Cyril Gupta