我正在创建一个DotVVM应用程序,我想在每个页面上显示注销按钮或登录表单。因此,我使用ViewModel来处理登录或注销。 因为我想在每个页面上都有这个控件,所以我将它放在我的.master页面中。
我的DotMaster页面如下所示:
@viewModel MyApp.ViewModels.AppViewModelBase, MyApp
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{value:Title}}</title>
</head>
<body>
<nav class="navbar navbar-inverse navbar-default">
...
<cc:LoginPanel DataContext="{value: LoginSection}"></cc:LoginPanel>
...
</nav>
...
</body>
</html>
Coresponding ViewModel AppViewModelBase 看起来像这样。
using System.Threading.Tasks;
using DotVVM.Framework.ViewModel;
using MyApp.ViewModels.Login;
namespace MyApp.ViewModels
{
public class AppViewModelBase : DotvvmViewModelBase
{
public string SubpageTitle { get; set; }
public string Title { get { return string.Format("{0} - {1}", LogoText, SubpageTitle); } }
public LoginSection LoginSection { get; set; } = new LoginSection();
...
}
}
我的 LoginSection ViewModel也继承自 DotvvmViewModelBase ,问题是, LoginSection 的Context属性永远不会被填充并保持为空。 我是否应该手动设置内部ViewModel的Context?我还注意到AppViewModelBase的Context没有在它的基础构造函数中设置,但稍后在某处。
此用例的最佳做法是什么?
答案 0 :(得分:1)
在当前版本的DotVVM(0.8.6-pre)中,页面视图模型的Context属性由框架设置(在调用Init
方法之前)。
但是,如果viewmodel包含其他对象,则不会设置这些Context(主要是因为性能原因 - 我们必须使用反射浏览视图模型并分析每个属性)。
目前,我建议将Context属性传递给Init
阶段的子对象。
public override Task Init()
{
LoginSection.Context = Context;
}
但是,在将来的版本中,我们计划添加一些机制来自动注入这些框架对象。