持久化视图状态数据并中继到 Knockout.JS

Posted

技术标签:

【中文标题】持久化视图状态数据并中继到 Knockout.JS【英文标题】:Persisting data on view state and relaying to Knockout.JS 【发布时间】:2019-12-13 01:06:14 【问题描述】:

我目前正在开发一个使用 Knockout、Bootstrap 和 JQuery 的 asp.net 网络表单。我在通过“向导步骤”进行数据持久性方面遇到问题。

我想做的是获取客户端的邮件状态并将其保留到其他页面,然后使用 Knockout 使字段可见并创建验证。

我了解到您可以使用隐藏状态来完成此操作,但我在将值传递给 Knockout 并最终让其他字段显示时遇到了问题。

这是一个逐页执行所有步骤的 c#。

    protected void StepChanged(object sender, EventArgs e)
    
        if (IsPostBack)
        
            if (QuoteWizard.ActiveStepIndex == 0)
                txtFirstName.Focus();

            if (QuoteWizard.ActiveStepIndex == 1)
            
                Session["State"] = ddlState.Value;
                rblMailAddr.Focus();
            

            if (QuoteWizard.ActiveStepIndex == 3)
            
                txtDriverFName1.Value = txtFirstName.Value;
                txtDriverMI1.Value = txtMI.Value;
                txtDriverLName1.Value = txtLastName.Value;

                String DOB;
                DOB = Convert.ToDateTime(txtDOB.Value).ToString();
                txtDriverDOB1.Value = DOB;

                txtDriverFName1.Focus();
            

我觉得奇怪的是 txtDriverFName1.Value = txtFirstNAme.Value;正确传递,但我无法从下拉列表中获取状态或出生日期以从一个步骤传递到另一个步骤。

   <select id="ddlState" runat="server" class="form-control" data-bind="value: MailState, updateValue: 'afterkeydown'">

后跟状态列表,然后我尝试将其传递给淘汰赛以使字段可见:

    self.MailState = ko.observable("",  persist: "MailState" );

但是,一旦我到达下一步,ViewState 中的值就会被删除并且

    <div class="btn-group" data-toggle="buttons" style="padding-left: 10px" data-bind="visible: MailState() == 'CA'">

即使在之前的视图状态中选择了 CA,也不再可见。

那么,我将如何通过 QuoteWizard.ActiveStepIndex 中的 2 个或更多步骤来保持下拉列表的值,并将其分配给“MailState()”,然后激活 Knockout?

【问题讨论】:

【参考方案1】:

在 data-bind 中将 bindinghandler 句柄绑定到 excute 表达式,然后可见的 bindinghandler 会将其解包为 observable 中的值。但是在您的代码中,您使用

data-bind="visible: MailState == 'CA'" //MailState is observalbe then like function() == 'CA' - that not right

应该改为:

data-bind="visible: MailState() == 'CA'" 

【讨论】:

感谢您的帮助!不幸的是,我在页面中的其他地方解开了变量;当我使用调试器并在回发后检查值时,它是空白的,因为在 ViewState 刷新时它不会持续存在。 (据我了解。)我已经修改了我的问题以反映这一点,再次感谢您尝试提供帮助!

以上是关于持久化视图状态数据并中继到 Knockout.JS的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 knockout.js 订阅变量状态更改

在 knockout.js 中将 observable 从一个视图模型传递到另一个视图模型

Knockout.js ko.mapping.toJS 在我看来没有刷新数据

如何使用 Knockout.js 将多个 View 绑定到单个 ViewModel

访问 Javascript Html 模板并使用 Knockout.js 绑定数据

更新 knockout.js 和 SignalR 库后,knockout-mapping js 不会更新视图中的列表