【发布时间】:2009-10-15 17:18:16
【问题描述】:
我想使用 ASP.NET MVC 构建一个带有“单页界面”的 Web 应用程序。
我已经搜索过这是否至少是可能的,我认为答案是:不是通过简单的方式(阅读http://msdn.microsoft.com/en-us/magazine/cc507641.aspx#S2倒数第二段;不过那篇文章来自 2008 年 5 月)。
我发现了其他通过使用 jQuery 进行编码/黑客攻击来实现这一点的示例。但是,如果可能的话,我正在寻找一个干净的解决方案,使用标准的 .NET 方法。
当您创建一个新的“MVC Web 应用程序”时,我想要的是完全相同的功能。但是,我想要的不是重新加载整个页面的“/Home/About”链接,而是通过 AJAX 仅加载新部分的“#Home/About”链接。
使用 Html.RenderPartial 调用模板(部分视图)的标准方法正是我想要的,然后才通过 AJAX 请求加载它们。
当然,可能由于某种原因我不能使用由母版页呈现的 这些 模板(也许它总是期望在某个上下文中从某个地方左右)。但是,对于如何构建模板页面并从母版页面获取它们,也许还有另一种干净的解决方案。
谁有一个很好的解决方案来实现这样的东西,单页界面?
PS:我正在 Visual Web Developer 2008 Express Edition 中进行开发,并安装了 MVC 1.0,使用 C#
[编辑] 下面我读到使用模板是可能的,而且 jQuery 看起来确实是不可避免的,所以我对其进行了测试。 以下代码将 Html.ActionLink 创建的常规链接转换为锚链接(带 #)以包含历史记录,然后通过 AJAX 获取页面并仅注入我感兴趣的 html 部分(即 div 中的部分页面#部分视图):
$("a").each(function() {
$(this).click(function() {
$("div#partialView").load($(this).attr("href") + " div#partialView");
location.hash = $(this).attr("href");
return false;
});
});
这些链接也允许优雅的降级。
但我现在剩下的仍然是获取整个页面,而不是仅获取部分页面。更改控制器没有帮助;它仍然为我提供了整个页面的 html,以及所有这些语句:
public ActionResult About()
{
return View();
return View("About");
return PartialView();
return PartialView("About");
}
如何只返回我感兴趣的部分的内容(即 Home/About.aspx 的内容)? 我想要的是使用 AJAX 发布一个值(例如“requesttype=ajax”),以便我的控制器知道该页面是通过 AJAX 获取的并且只返回部分页面;否则它将返回整个页面(即当您访问 /Home/About 而不是 #Home/About 时)。
也许改变 Global.asax.cs 为 AJAX 调用创建一个新的路由模式是一个好习惯,它只会返回部分页面? (我还没有研究这么多。)
[编辑2]
Robert Koritnik 是对的:我还需要一个 About.ascx 页面 (UserControl),其中只有该页面的小 HTML 内容。 About.aspx 的第一行通过MasterPageFile="~/..../Site.master" 与母版页链接,导致打印所有HTML。
但是要能够在我的控制器中执行以下操作:
public ActionResult About()
{
return Request.IsAjaxRequest() ? (ActionResult)PartialView() : View();
}
我需要更改找到PartialView(.ascx 文件)和View(.aspx)文件的方式,否则这两种方法将返回相同的页面(About.aspx,最终导致无限循环)。
将以下内容放入Global.asax.cs后,将返回正确的页面,并带有PartialView()和View():
protected void Application_Start()
{
foreach (WebFormViewEngine engine in ViewEngines.Engines.Where(c => c is WebFormViewEngine))
{
/* Normal search order:
new string[] { "~/Views/{1}/{0}.aspx",
"~/Views/{1}/{0}.ascx",
"~/Views/Shared/{0}.aspx"
"~/Views/Shared/{0}.ascx"
};
*/
// PartialViews match with .ascx files
engine.PartialViewLocationFormats = new string[] { "~/Views/{1}/{0}.ascx", "~/Views/Shared/{0}.ascx" };
// Views match with .aspx files
engine.ViewLocationFormats = new string[] { "~/Views/{1}/{0}.aspx", "~/Views/Shared/{0}.aspx" };
}
RegisterRoutes(RouteTable.Routes);
}
【问题讨论】:
-
您是否要求由同一路线定义的CRUD?即localhost/Admin,该页面将允许您创建、读取、更新和删除管理员,而无需执行 /Admin/Create?
-
不,我想知道在 ASP.NET 中使用 SPI 的“最佳实践”是什么。并不是什么具体的东西,而是如何开始使用该技术 (SPI) 构建 web 应用程序。但是,当我要求 CRUD 的情况下,您似乎已经准备好了答案? :)
标签: ajax asp.net-mvc partial-views single-page-application