我有一个相当大而复杂的表单,其中包含许多表单组件。
在一个下拉字段中,我添加了public class AnyController
{
//if you want to access connectionId in here , add hubcontext in here too
private readonly ChatHub _chatHub;
public AnyController(ChatHub chatHub)
{
_chatHub = chatHub;
}
public IActionResult Index()
{
_chatHub.AddToGroup("groupname");
}
}
来处理下拉列表中的更改。基于这些更改,我将以这种方式更新表单中的其他字段:
AjaxFormComponentUpdatingBehavior
Foo字段已使用下拉列表中的值正确更新。
问题在于,表单中其他文本字段中的所有更改均被删除。我知道会发生这种情况,因为尚未在模型中对其进行更新。
我该如何解决? 是否可以通过某种方式(不提交表格)将表格中到目前为止所有填写的数据写入模型?
我需要在ajax方法中将整个表单添加到目标中,因为要更新的字段是表单模型对象的子代,并动态地添加到了表单中。例如,我不能做masterFooDropDown.add(new AjaxFormComponentUpdatingBehavior("change") {
@Override
protected void onUpdate(AjaxRequestTarget target) {
String value = (String) getFormComponent().getModelObject();
if (value != null) {
for (Foo foo: form.getModelObject().getFoos()) {
foo.setValue(value);
}
target.add(form);
}
}
});
,因为可能有任意数量的“ fooFields”。
答案 0 :(得分:3)
您可以在所有其他表单(选择)组件上使用AjaxFormComponentUpdatingBehavior / AjaxFormChoiceComponentUpdatingBehavior,以便它们在修改后更新表单的模型对象。
您可以使用Component#visitChildren()并动态决定要添加到AjaxRequestTarget中的特定表单组件(如果很容易确定)。甚至AjaxRequestTarget也有方法#addChildren()
,但是过滤子组件并不那么灵活。