gpt4 book ai didi

ajax - 使用knockoutjs构建动态表单

转载 作者:行者123 更新时间:2023-12-04 17:52:55 27 4
gpt4 key购买 nike

我需要从数据库构建一个动态表单。我有以下实体来动态定义表单字段:

    public class FormField {
public int ID { get; set; }
public string Name { get; set; }
public string Type { get; set; } // Possible values are: 'Radio','Combo','Text'. A dropdown will be created for a Combo type of element, a radio set for Radio type of element and a text input for Text type of element.
public string Options { get; set; } // Only relevant in case of Radio/Combo type
public string Default { get; set; } // Default value in case of Type 'Text' and selected value in case of Type 'Radio/Combo'
public string Blankout { get; set; }// An expression to define when this field should be hidden
}

/* A sample JSON array (from the DB) to build the form would be:
[
{ Name:"Gender", Type:"radio", Options:["Male","Female","Unknown"], Default:"Male", Blankout:"Never" },
{ Name:"Age", Type:"text", Options:"None", Default:15, Blankout:"Never" },
{ Name:"Neighbourhood", Type:"Combo", Options:["Eastern","Western","Northern","Southern","Central"], Default:"Central", Blankout:"if (Age < 40 or Voted='Obama')" },
{ Name:"Voted", Type:"Combo", Options:["Obama","Romney","Harry Potter"], Default:"Harry Potter", Blankout:"if ((Gender='Female' and Age < 15) or Neighbourhood='Eastern'" }
]
*/

我可以从 DB 中的“FormField”记录构建一个动态表单,但问题是我需要跟踪任何表单字段值的变化,当值发生变化时,我需要将所有表单数据发送到服务器(异步)以评估服务器上的“空白”公式。如果我在没有 KnockoutJS 的情况下执行此更改跟踪操作,则它不会响应并且变得非常复杂。
我已经阅读了多个 KnockoutJS 教程,但无法弄清楚如何针对这个特定问题组织我的 ViewModel。

任何帮助,将不胜感激。

更新 1

我尝试使用以下代码将此表单数据发布到 Controller :
    $.ajax({
type: "POST",
url: "/MyController/GetBlankoutElements",
contentType: 'application/json',
dataType: 'json',
data: JSON.stringify(ko.toJSON(self)),
success: function(result) {
alert(result);
//self.HiddenElements(result.split(','));
}
});

在我的 Controller 中,我尝试了以下代码:
    [HttpPost]
public ActionResult GetBlankoutElements(List<MyFieldViewModel> Fields)
{
return Json(Fields); // List, Fields is null here
}

她是 MyFieldViewModel 类的样子:
    public class MyFieldViewModel 
{
public string Title { get; set; }
public string Name { get; set; }
public string Type { get; set; }
public string Default { get; set; }
public string[] Options { get; set; }
}

我已经尝试过 Post an Array of Objects via JSON to ASP.Net MVC3 中描述的技巧

以下是我执行 alert(ko.toJSON(self)) 时打印出来的 Json 数据
    {"Fields":
[{"Title":"CCType","Name":"CCType","Type":"Radio","Default":"Enterprise","Options":["Enterprise","Express","CVP","PCCE"]},{"Title":"Industry","Name":"Industry","Type":"Combo","Default":"Banks","Options":["Banks","ServiceProvider","Outsourcer","Airlines","Utilities","Government","Retail"]},{"Title":"Customer Lab","Name":"CustomerLab","Type":"Combo","Default":"0","Options":["0","1"]},{"Title":"No of Agents","Name":"Agents","Type":"Text","Default":"if(c.CCType==\"CVP\") then 10 else 25","Options":[]},{"Title":"ExpLicType","Name":"ExpLicType","Type":"Radio","Default":"if(c.CCType==\"Express\") then \"Enhanced\" else \"None\"","Options":["None","Premium","Standard","Enhanced"]},{"Title":"Multimedia","Name":"Multimedia","Type":"Combo","Default":"WIM","Options":["None","EIM","WIM","EIM&WIM","BSMediaRouting","MCAL"]}],
"HiddenElements":[]
}

我需要的只是字段名称及其由用户选择的值,即使我将此 json 数据映射到我的 MyFieldViewModel 类,我也很困惑,我仍然如何获得所选的 VALUES ?

更新 2 (JSON 数据映射有效)

当我改变
    data: JSON.stringify(ko.toJSON(self))


数据:ko.toJSON(self)

映射在我的 Controller 上运行良好,如下图所示:
Debug screenshot of Mapped list object from post json data

现在,问题仍然存在,发布表单的重点是使用用户在表单上的输入更新服务器,即针对每个表单字段元素的值。
我如何发布表单字段的当前选定/键入值?
例如,在上面的屏幕截图中,我可以看到默认值,但看不到当前选择的值。

最佳答案

对于跟踪更改,您可以使用 dirty flag来自这篇文章:http://www.knockmeout.net/2011/05/creating-smart-dirty-flag-in-knockoutjs.html .

创建以下 View 模型:

function FormField(data) {
var self = this;

self.Name = ko.observable(data.Name);
self.Type = ko.observable(data.Type);
self.Options = ko.observableArray(data.Type != 'text' ? data.Options : []);
self.Default = ko.observable(data.Default);
}

function ViewModel(data) {
var self = this;

self.Fields = ko.observableArray(ko.utils.arrayMap(data, function(item) {
return new FormField(item);
}));

self.dirtyFlag = new ko.dirtyFlag(this);

self.isDirty = ko.computed(function (){
if (self.dirtyFlag.isDirty())
{
alert("Value changed!");
// Do async update.
}
});
}

Html 标记:
<div data-bind="foreach: Fields">
<b data-bind="text: Name"></b>
<!--ko if: Type() == "combo"-->
<select data-bind="options: Options, value: Default"></select> <!--/ko-->
<!--ko if: Type() == "radio"-->
<div data-bind="foreach: Options">
<input type="radio" value="cherry" data-bind="value: $data, checked: $parent.Default" />
<span data-bind="text: $data"></span>
</div>
<!--/ko-->
<!--ko if: Type() == "text"-->
<input type="text" data-bind="value: Default"></input>
<!--/ko-->
<br/>
</div>

这是工作 fiddle : http://jsfiddle.net/vyshniakov/CWTTR/

编辑:

如果我理解正确,以下是您问题的答案:

要将所有字段发布到服务器,您可以使用 ko.toJSON(self)功能。您的 ajax 调用将如下所示:
    $.ajax({
type: "POST",
url: "controller/action",
contentType: 'application/json',
data: JSON.stringify(ko.toJSON(self)),
success: function(result) {
self.HiddenElements(result);
}
});

查看更新的 fiddle 以了解如何根据服务器的响应隐藏某些字段: http://jsfiddle.net/vyshniakov/CWTTR/1/ .

关于ajax - 使用knockoutjs构建动态表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13138778/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com