我正在将一个新网站放在一起,如果用户启用了javascript,它将利用AJAX来浏览页面内容。
所以,我处于这样一种情况,即每个Action Method都要求检查请求是否通过AJAX,这很简单。如果请求是通过AJAX然后我可以返回部分视图,如果没有,则可以返回完整视图。
但是,使用这种模式,我需要为网站上的每个页面创建一个View和PartialView。它们之间唯一真正的区别是要包含母版页。
我在这里错过了一个诀窍,就是这种双倍的观点是唯一的出路吗?
由于
编辑 - 更多信息
假设我有一个可以通过/site/test
访问的页面。在我的JS的某个地方,我会在网址中添加一个哈希值,如#/site/test
。然后,JS会监视任何哈希更改并根据需要加载部分视图。如果JS不可用,则需要返回整个视图。
因此,对于每个页面,我都需要视图,然后包含对RenderPartial的调用,这将加载实际包含页面内容的局部视图。因此,对于每个页面都有两个文件。似乎应该有一种更清洁的方式来做到这一点。
答案 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>
无论如何,这是我对它的看法!! ;)