Получить текущий ViewContext в ASP.Net MVC

У меня есть функция ASP.Net MVC JsonResult, в которой я хочу вернуть содержимое PartialView (содержимое должно быть загружено с использованием Ajax, и по какой-то причине я не могу вернуть PartialViewResult).

Чтобы отобразить PartialView, мне нужен объект ViewContext.

Как получить текущий объект ViewContext в методе Action? Я даже не вижу HttpContext.Current в своем методе действия.

Я использую ASP.net MVC 1.


person Cyril Gupta    schedule 07.01.2010    source источник


Ответы (2)


ViewContext недоступен в методе действия, потому что он создается позже, перед визуализацией представления. Я бы посоветовал вам использовать MVCContrib BlockRenderer. для преобразования содержимого частичного представления в строку.

person Darin Dimitrov    schedule 07.01.2010
comment
Это именно то, что мне нужно. Теперь пытаюсь заставить его работать. Спасибо Дарин. - person Cyril Gupta; 07.01.2010
comment
Я, очевидно, упускаю необходимость в этом, не будет ли кто-нибудь достаточно любезен, чтобы привести мне пример того, где это будет необходимо? - person Lazarus; 07.01.2010
comment
thriftybliss.spaces.live.com/ blog/ Однако для меня это было быстрее и проще. - person Cyril Gupta; 08.01.2010
comment
Так же и бережливое блаженство - person tony; 15.09.2016

Возможно, я где-то что-то упустил, но мои действия, возвращающие частичные представления, делают это, возвращая объект представления, который ссылается на страницу ascx. Это вернет частичный HTML без полных конструкций страницы (html, заголовок, тело и т. д.). Не уверен, почему вы хотите сделать что-то помимо этого, есть ли конкретная причина, по которой вам нужно вернуть PartialViewResult? Вот пример из моего рабочего кода.

Сначала действие в моем контроллере:

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

И затем частичный вид (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>
<%} %>

Наконец, Jquery, который устанавливает вызов:

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

Итак, полный процесс AJAX, надеюсь, это поможет.

---- ОБНОВЛЕНИЕ после комментария ----

Возврат данных Json так же прост:

Во-первых, инициирование вызова AJAX при изменении поля выбора:

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

JavaScript, который обрабатывает возвращенные данные json:

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

И, наконец, само действие, которое возвращает данные 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);
    }

Это помогает? Если нет, то можете ли вы опубликовать часть кода, над которым вы работаете, поскольку я что-то упускаю.

person Lazarus    schedule 07.01.2010
comment
Lazarus, я хочу вернуть JSONResult, потому что данные, которые я возвращаю через Ajax, содержат некоторые элементы, которые необходимо обрабатывать с помощью Javascript на стороне клиента. Я не хочу вызывать две отдельные функции для JSon и Partial, поэтому я хочу отображать партиал как json val. - person Cyril Gupta; 07.01.2010
comment
JsonResult jsn = Json(новый словарь‹строка, объект› {{успех, истина}, {lastPID, posts[0].ID}, {content, Globals.RenderPartialToString(~/Views/Partial/Posts.ascx,ViewData,this .ControllerContext,TempData) } }); - person Cyril Gupta; 07.01.2010