Knockout 和 ASP.NET MVC 多页面
Knockout and ASP.NET MVC multi page
我对 knockout 很陌生,在应用我的绑定和多个视图时,我不知道如何使用 ASP.NET MVC 最好地构建 knockout。我了解如何在单页应用程序中执行此操作。但是我的应用程序包含多个服务器端控制器和多个视图。每个视图都可以有自己的淘汰视图模型。
何时以及如何应用绑定?我最后加载了所有 javascript,这意味着我无法内联调用我的视图模型。
使用某种 MasterViewModel 然后在我的视图中使用 with 绑定是否是一个好习惯(这是我能想到的唯一解决方案)?
是的,这是一个很好的做法,因为如果您尝试为多个视图创建一个视图模型,那么一切看起来都很复杂,并且会失去可读性(完全取决于复杂程度)。
你必须尝试这样的事情才能使事情变得可读和简单
查看模型:
var MasterViewModel = {
vm1 : new ViewModel1(),
vm2 : new ViewModel2(),
vm3 : new ViewModel3(),
vm4 : new ViewModel4(),
}
ko.applyBindings(MasterViewModel);
另一种可行的方法,只需向 ko.applybindings
添加附加参数即可区分哪个视图属于哪个视图模型
示例:
//view
<div id='viewmodel1'>
</div>
<div id='viewmodel2'>
</div>
var vm1 = function(){ //code}
var vm2 = function(){ //code}
ko.applyBindings(new vm1(), document.getElementById("viewmodel1"));
ko.applyBindings(new vm2(), document.getElementById("viewmodel2"));
如果我记得够清楚的话,stack-overflow 中类似的帖子很少,你可以参考
对于每个 ASP.NET 视图,您创建一个绑定到 mvc 视图的 ViewModel。我会在 ASP.NET MVC 模型之后命名 ViewModel。
ASP.NET MVC 模型:
public class LoginViewModel
{
[Required]
[Display(Name = "Email")]
[EmailAddress]
public string Email { get; set; }
[Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
}
淘汰 ViewModel:
var LoginViewModel = function () {
var self = this;
self.email = ko.observable();
self.password = ko.observable();
self.rememberMe = ko.observable();
self.login = function () {
...
}
};
我通常使用 ASP.NET 捆绑捆绑所有视图模型 .js,然后在每个 MVC 视图中绑定 Knockout 视图模型。
$(function() {
ko.applyBindings(new LoginViewModel());
});
如果您需要在第一次加载时从 mvc 模型填充模型,我会使用 json.net 序列化为 json,然后将其传递给 ViewModel 承包商:
var loginModel = '@JsonConvert.SerializeObject(Model)';
$(function() {
ko.applyBindings(new LoginViewModel(loginModel));
});
然后在您的淘汰 ViewModel 中,您可以从传递给承包商的模型中填充可观察值:
var LoginViewModel = function (loginModel) {
var self = this;
self.email = ko.observable(loginModel.email);
self.password = ko.observable(loginModel.password);
self.rememberMe = ko.observable(loginModel.rememberMe);
为了 json 使用驼峰式大小写,我将 json.net 改为序列化为 camlecase。
如果您有一个类似于 SPA 的复杂页面,例如具有多个步骤的表单页面,本质上是一个具有多个视图状态的页面,您将使用一些 MasterViewModel,正如 super cool 所解释的那样。
我对 knockout 很陌生,在应用我的绑定和多个视图时,我不知道如何使用 ASP.NET MVC 最好地构建 knockout。我了解如何在单页应用程序中执行此操作。但是我的应用程序包含多个服务器端控制器和多个视图。每个视图都可以有自己的淘汰视图模型。
何时以及如何应用绑定?我最后加载了所有 javascript,这意味着我无法内联调用我的视图模型。
使用某种 MasterViewModel 然后在我的视图中使用 with 绑定是否是一个好习惯(这是我能想到的唯一解决方案)?
是的,这是一个很好的做法,因为如果您尝试为多个视图创建一个视图模型,那么一切看起来都很复杂,并且会失去可读性(完全取决于复杂程度)。
你必须尝试这样的事情才能使事情变得可读和简单
查看模型:
var MasterViewModel = {
vm1 : new ViewModel1(),
vm2 : new ViewModel2(),
vm3 : new ViewModel3(),
vm4 : new ViewModel4(),
}
ko.applyBindings(MasterViewModel);
另一种可行的方法,只需向 ko.applybindings
添加附加参数即可区分哪个视图属于哪个视图模型
示例:
//view
<div id='viewmodel1'>
</div>
<div id='viewmodel2'>
</div>
var vm1 = function(){ //code}
var vm2 = function(){ //code}
ko.applyBindings(new vm1(), document.getElementById("viewmodel1"));
ko.applyBindings(new vm2(), document.getElementById("viewmodel2"));
如果我记得够清楚的话,stack-overflow 中类似的帖子很少,你可以参考
对于每个 ASP.NET 视图,您创建一个绑定到 mvc 视图的 ViewModel。我会在 ASP.NET MVC 模型之后命名 ViewModel。
ASP.NET MVC 模型:
public class LoginViewModel
{
[Required]
[Display(Name = "Email")]
[EmailAddress]
public string Email { get; set; }
[Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
}
淘汰 ViewModel:
var LoginViewModel = function () {
var self = this;
self.email = ko.observable();
self.password = ko.observable();
self.rememberMe = ko.observable();
self.login = function () {
...
}
};
我通常使用 ASP.NET 捆绑捆绑所有视图模型 .js,然后在每个 MVC 视图中绑定 Knockout 视图模型。
$(function() {
ko.applyBindings(new LoginViewModel());
});
如果您需要在第一次加载时从 mvc 模型填充模型,我会使用 json.net 序列化为 json,然后将其传递给 ViewModel 承包商:
var loginModel = '@JsonConvert.SerializeObject(Model)';
$(function() {
ko.applyBindings(new LoginViewModel(loginModel));
});
然后在您的淘汰 ViewModel 中,您可以从传递给承包商的模型中填充可观察值:
var LoginViewModel = function (loginModel) {
var self = this;
self.email = ko.observable(loginModel.email);
self.password = ko.observable(loginModel.password);
self.rememberMe = ko.observable(loginModel.rememberMe);
为了 json 使用驼峰式大小写,我将 json.net 改为序列化为 camlecase。
如果您有一个类似于 SPA 的复杂页面,例如具有多个步骤的表单页面,本质上是一个具有多个视图状态的页面,您将使用一些 MasterViewModel,正如 super cool 所解释的那样。