我开始使用Visual Studio 2013附带的MVC 5单页面应用程序模板。我非常熟悉Knockout.js
,虽然我不熟悉Sammy.js
,但我一直在学习它,它似乎并不那么复杂。
我无法理解MVC 5 SPA模板如何结合这些技术,或者Visual Studio团队为模板提供了什么样的示例。该模板提供了一个home.viewModel.js
文件作为起点,但我无法理解如何使用Sammy.js
路由添加更多视图。如果他们提供了第二个局部视图和视图模型就好了。
我的问题
简而言之,我的实际问题是:
- 我该如何显示一个局部视图并将其链接到
#users
路由,以模仿提供的home.viewmodel.js
,以便我可以在#home
和#users
之间来回切换?在users.viewModel.js
中,Sammy.js
路由定义会是什么样子? - 我需要做任何特殊的事情才能启用浏览器的后退按钮,或者只要我正确定义了我的路由,它就会自动工作?
- 是我还是这个模板感觉像是一个半成品的示例?
以下代码仅供额外参考/上下文,但可能不是回答问题所必需的。
一些背景信息
假设我创建了一个局部视图_Users.cshtml
,由一个MVC控制器UserController
提供,而不是WebAPI
控制器,并且我想通过Sammy.js
路由显示该局部视图。为此,我已经创建了一个users.viewModel.js
。现在...
提供的Index.cshtml
视图如下:
@section SPAViews {
@Html.Partial("_Home")
}
@section Scripts{
@Scripts.Render("~/bundles/knockout")
@Scripts.Render("~/bundles/app")
}
我猜这是指应用程序的“外壳”页面,其他部分视图将加载以替换 _Home
部分的内容。
问题在于在 home.viewmodel.js
上初始化 Sammy
路由时没有传递元素选择器来容纳内容,就像这样:
Sammy(function () {
this.get('#home', function () {
// more code here
}
例如,而不是
Sammy("#content", function () {
this.get('#home', function () {
// more code here
}
我是否应该一开始就将_Users
部分视图与_Home
放在一起,以便Index
视图看起来像这样?
@section SPAViews {
@Html.Partial("_Home")
@Html.Partial("_Users")
}
@section Scripts{
@Scripts.Render("~/bundles/knockout")
@Scripts.Render("~/bundles/app")
}
当然,这将同时显示两个视图,这不是我们想要的。
我的users.viewmodel.js
看起来像这样:
function UsersViewModel(app, dataModel) {
var self = this;
Sammy(function () {
this.get('#users', function () {
// the following line only makes sense if _Users is not
// called from Index.cshtml
//this.load(app.dataModel.shoppingCart).swap();
});
});
return self;
}
app.addViewModel({
name: "Users",
bindingMemberName: "users",
factory: UsersViewModel
});
我尝试使用Sammy.js
的swap
方法,但由于我的_Users
视图是一个部分视图,而且Sammy
没有设置针对特定元素的操作,所以整个页面被替换了...而且浏览器的后退按钮似乎不起作用。
很抱歉文本量如此之大,如果这是一个非常琐碎的问题,也请谅解。我很困扰自己似乎无法自己解决它,即使已经查阅了文档。