gpt4 book ai didi

playframework - Play Framework 处理部分形式

转载 作者:行者123 更新时间:2023-12-04 05:51:04 24 4
gpt4 key购买 nike

我正在使用 Play 框架,并且我有一个常见的用例来更新具有 Controller 操作中的表单的模型。但是我在理解它背后的概念时遇到了一些问题,因为如果你有一个包含模型所有属性的表单,这只是工作。如果您只有部分形式,例如仅编辑用户模型的密码,此方法会破坏模型,因为它将模型的其他属性设置为 null。
这个问题有什么“官方”解决方案吗? Play 以任何方式仅更新现有属性吗?

public static Result update(Long id) {
Model model = Model.findById(id);
Form<Model> filledForm = modelForm.bindFromRequest();
if (filledForm.hasErrors()) {
return badRequest(edit.render(filledForm));
} else {
model.update();
flash("message", "Created new Model!");
return ok(index.render());
}
}

可能解决方案以某种方式在于可以使用附加参数调用 bindFormRequest() 方法,例如字符串或字符串映射?但我无法找出这样做的目的。对此的一些见解也会很棒。
非常感谢!

最佳答案

在最近的一个项目中,我需要这种功能,我必须重新实现 Form 类(基于原始 Play Form),以允许在 bindFromRequest() 中添加一个附加参数。方法。

以你的代码为例,它会变成这样:

Model model = Model.findById(id);
Form<Model> filledForm = CustomForm.form(Model.class).bindFromRequest(model);

这个想法是只修改表单中定义的字段,并保持模型的其他字段不变。

要允许此特定绑定(bind),您必须重新定义 bind(Map<String,String> data, String... allowedFields)方法(与 bindFromRequest 一起)具有以下内容:

public Form<T> bind(T instance, Map<String,String> data, String... allowedFields) {

DataBinder dataBinder = null;
Map<String, String> objectData = data;
if(rootName == null) {
dataBinder = new DataBinder(instance);
} else {
dataBinder = new DataBinder(instance, rootName);
objectData = new HashMap<String,String>();
for(String key: data.keySet()) {
if(key.startsWith(rootName + ".")) {
objectData.put(key.substring(rootName.length() + 1), data.get(key));
}
}
}

而不是创建 DataBinderblankInstance()正如标准 Play Form 类所做的那样,您使用模型实例作为构造函数参数来创建它。

关于playframework - Play Framework 处理部分形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17228624/

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