在ASP.Net MVC中获取当前的ViewContext

时间:2010-01-07 08:30:02

标签: asp.net-mvc jsonresult viewcontext

我有一个ASP.Net MVC JsonResult函数,我想在其中返回PartialView的内容(内容必须使用Ajax加载,并且由于某种原因我无法返回PartialViewResult)。

要渲染PartialView,我需要ViewContext对象。

如何在Action方法中获取当前的ViewContext对象?我甚至没有在我的动作方法中看到HttpContext.Current。

我正在使用ASP.net MVC 1.

2 个答案:

答案 0 :(得分:4)

ViewContext在action方法中不可用,因为它是在渲染视图之前构造的。我建议你使用MVCContrib's BlockRenderer将部分视图的内容呈现为字符串。

答案 1 :(得分:0)

我可能在某个地方错过了一个点,但是返回部分视图的我的动作通过返回引用ascx页面的View对象来实现。这将返回部分HTML而没有完整的页面构造(html,head,body等)。不知道你为什么要做除此之外的任何事情,是否有一个特定的原因你需要返回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');
    });

处理返回的json数据的javascript:

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数据的Action本身:

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

这有帮助吗?如果没有,那么你可以发布你正在处理的一些代码,因为我遗漏了一些东西。