Knockout.js 如何从隐藏输入中获取敲除以读取值

Knockout.js 如何从隐藏输入中获取敲除以读取值,knockout.js,asp.net-mvc-5,Knockout.js,Asp.net Mvc 5,我的MVC应用程序中有一个带有隐藏输入的表单,我希望通过敲除读取该表单的值。不幸的是,Knockout中的可观察函数用括号中指定的任何值替换DOM中的原始值,以便 self.title = ko.observable() 将隐藏输入的值更改为空白。如果我有一个用户需要填写的空白表单,这就不会那么糟糕了。我在Stackoverflow上找到了一些使用复杂定制绑定的答案,但我就是不相信这么简单的东西需要这么复杂的解决方案。敲除是否有一种本机方式: 从DOM读取输入的现有值 绑定现有值,而不首先将其

我的MVC应用程序中有一个带有隐藏输入的表单,我希望通过敲除读取该表单的值。不幸的是,Knockout中的可观察函数用括号中指定的任何值替换DOM中的原始值,以便

self.title = ko.observable()
将隐藏输入的值更改为空白。如果我有一个用户需要填写的空白表单,这就不会那么糟糕了。我在Stackoverflow上找到了一些使用复杂定制绑定的答案,但我就是不相信这么简单的东西需要这么复杂的解决方案。敲除是否有一种本机方式:

  • 从DOM读取输入的现有值
  • 绑定现有值,而不首先将其替换为 初始值
  • 下面是DOM:

    <div class="form-group has-success">
                    <input type="hidden" id="title" value="@RazorFunction('Title')" data-bind="value:title" />
                    <label class="control-label" for="message">@RazorFunction('Label')</label>
                    <textarea class="form-control" placeholder="@RazorFunction('Placeholder')" rows="5" cols="50" data-bind="value:message"></textarea>
                    <br />
                    <button class="btn btn-primary" data-bind="click:sendMessage">@RazorFunction('Send')</button>
                </div>
    
    我的MVC应用程序中有一个带有隐藏输入的表单,我希望通过敲除读取该表单的值

    这是完全错误的想法。Knockout从模型生成用户界面(即视图),而不是从用户界面生成模型

    不幸的是,Knockout中的可观察函数用括号中指定的任何值替换DOM中的原始值,以便

    这正是应该发生的事情。用户界面反映了模型的要求

    这里的问题是:为什么视图的某些部分与数据模型不一致?纠正这一点,问题就会解决

    对于基于敲除的应用程序来说,带有值的隐藏输入是完全不必要的。如果服务器知道需要传输到客户端的值,则不要将其写入HTML。创建/发送包含模型初始化所需的所有值的JSON,让Knockout完成整个UI创建,抵制使用Razor视图创建动态UI的冲动

    以下是视图的外观(让Razor实现国际化,这很好):

    
    @RazorFunction('标签')
    
    @RazorFunction('Send')
    以及viewmodel:

    var Model = function (data) {
        var self = this;
        self.message = ko.observable(data.message)
        self.title = ko.observable(data.title)
        self.messages = ko.observableArray(data.messages);
    };
    

    其中,
    数据
    是具有初始值的对象

    我会完全忽略隐藏的输入,并将此值作为初始值提供给视图模型

    var init = {title: 'foo'};
    var Model = function(initial){
        var self = this;
        self.title = ko.observable(initial.title);
        // ...
    };
    var vm = new Model(init);
    
    如果确实需要保留此隐藏输入,可以尝试在viewmodel初始化之前获取其值

    var init = {};
    init.title = document.getElementById('title').value;
    ko.applyBindings(new Model(init));
    

    在模型集中,self.title=ko.observable(@RazorFunction('title'))。这就是我为解决这个问题所做的。没办法避开这个问题。回答得很好!这很有效,谢谢你。我在为这件事扯我根本不存在的头发。
    var init = {};
    init.title = document.getElementById('title').value;
    ko.applyBindings(new Model(init));