Question

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.

Was it helpful?

Solution

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.

OTHER TIPS

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top