如何在asp.net MVC中处理AJAX驱动的网站(很多视图和部分视图)?

时间:2010-12-01 15:59:27

标签: asp.net asp.net-mvc ajax

我正在将一个新网站放在一起,如果用户启用了javascript,它将利用AJAX来浏览页面内容。

所以,我处于这样一种情况,即每个Action Method都要求检查请求是否通过AJAX,这很简单。如果请求是通过AJAX然后我可以返回部分视图,如果没有,则可以返回完整视图。

但是,使用这种模式,我需要为网站上的每个页面创建一个View和PartialView。它们之间唯一真正的区别是要包含母版页。

我在这里错过了一个诀窍,就是这种双倍的观点是唯一的出路吗?

由于

编辑 - 更多信息

假设我有一个可以通过/site/test访问的页面。在我的JS的某个地方,我会在网址中添加一个哈希值,如#/site/test。然后,JS会监视任何哈希更改并根据需要加载部分视图。如果JS不可用,则需要返回整个视图。

因此,对于每个页面,我都需要视图,然后包含对RenderPartial的调用,这将加载实际包含页面内容的局部视图。因此,对于每个页面都有两个文件。似乎应该有一种更清洁的方式来做到这一点。

1 个答案:

答案 0 :(得分:4)

塞尔吉奥,是的,你错过了一招!

您应该整理页面,使其中的静态内容只是静态内容。然后,此静态页面调用提供动态内容的部分。这通常会在主页面中使用(我现在使用jquery根据微软在ajax采用的立场):

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2>My Header</h2>
    <%--lots of stuff omitted--%>
    <div id="dynamicList"><%Html.RenderPartial("List"); %></div>
    <%--also lots missed out here--%>
    <input type="button" id="btnRefresh" value="refresh" />
</asp:Content>

这意味着部分将始终在初始请求中呈现。后续刷新将调用控制器中的partial方法,并沿着以下行重新填充'dynmaicList'div:

<script type="text/javascript">
    // you might have a click or similar here to invoke the partial refresh
    $(function() {
         //click event (or some other 'change' event)
         $('#btnRefresh').click(function() {
             dynamicList();
         });
    });

    function dynamicList() {
        // where action/controller retruns a partialview result
        var url = '<%= Url.Action("List", "MyController") %>';
        // this is merely a wrapper method around jquery $ajax
        SendAjax(url, formParams(), beforedynamicListQuery, dynamicListResponse);
    }

    function beforedynamicListQuery() {
        $("#dynamicList").fadeTo('slow', 0.5);
    }

    function dynamicListResponse(data) {
        if (data.length != 0) {
            if (data.indexOf("ERROR:") >= 0) {
                $("#dynamicList_errmsg").html(data);
            }
            else {
                var selector = "#dynamicList";
                $(selector).fadeTo('slow', 1, function() {
                    $(this).html(data);
                });
            }
        }
    }
</script>

无论如何,这是我对它的看法!! ;)