spring表单:select元素:当'path'值被更新时,select在软刷新后仍然显示为旧值?

bybem2ql  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(349)

编辑:这个问题似乎与firefox无关-在chrome/ie中,它完全按照预期工作。这是firefox的bug,还是我不明白的东西?
我有Spring模型。表单中包含 <select> 元素-它使用jsp中的“path”属性绑定到modelmap中的相应元素。
然而 <select> 元素的外观值不会在软页面刷新时更新,即使模型Map中的值发生更改。对模型值的其他引用也会更新(例如,如果我只添加${mymodelmappvalue},那么该值将在软刷新时更新,因此不会发生缓存或任何事情)。
硬刷新(ctrl+f5)后,选择更新。如何在软刷新时更新select?

用例:

我第一次浏览到这个页面时,看到了正确绑定到表单字段的正确值—包括我的 <select> 元素-绑定到模型Map中的元素,例如:mymodelmapvalue='ordered'
在后台(例如,其他人的浏览器),当我在浏览器中打开页面时,mymodelmappvalue的值会更改,并将更改保留到db中。mymodelmapvalue='已发货'
最初,这些值在我的选项卡中不会更改—这是我所期望的,因为这些值不会从db中不断更新。
现在我在浏览器中按f5。
我可以看到一个正常的get调用被生成,并点击我的控制器,新模型被正确生成(mymodelmappvalue='shipped'),并与视图一起提供给浏览器。
对模型值的所有其他引用(例如${mymodelmapvalue})将显示为“shipped”
这个 <select> 元素仍然绑定到mymodelmapvalue,但将“ordered”显示为其值。

问题:

这是spring表单绑定的工作方式,还是我做错了什么?

代码:

spring窗体jsp定义:

<form:form commandName="productHolder" id="productForm" method="post">

        <form:input path="product.blah" placeholder="blah" class="blah-blah" />

        <br>

        ... a bunch of other fields ... 

        <br> 

        Supplier Status: 
        <form:select path="product.supplierStatusObjectFromListOfStatusObjects.currentSatus">
                <form:options items="${allProductSupplierStatuses}"/>
        </form:select>

        <br>

        Printing the value as a test: ${product.getSupplierStatusFromListOfStatusObjects.currentSatus}

        <br>

        <button class="btn btn-success" type="submit">Save</button>

</form:form>

向后剥离java控制器:

@RequestMapping(method=RequestMethod.GET)
public String showProductStatusScreen(ModelMap model, @RequestParam(value = "productId", required=false) Long productId){
    this.checkAccess(this.getCaller());
    Product product = productBusinessObject.getProductById(productId);      
    ProductHolder productHolder = this.generateProductHolder(product); 
    model.put("productHolder", productHolder); 
    //printing it out as a test: 
    System.out.println(productHolder.GetProduct.getSupplierStatusObjectFromListOfStatusObjects.getCurrentSatus);// <- Prints out the correct value
    return "/WEB-INF/jsp/productStatusScreen.jsp"; 
}
ej83mcc0

ej83mcc01#

如果以后有人用谷歌搜索我做过的事情。。。
这确实是一个浏览器问题,与spring表单完全无关。我只是太多的抽象的步骤远,以实现一开始。
它已经在chorome(v71)/ie(11)中默认工作了,只有firefox(v64.0)表现得很奇怪。
firefox故意不刷新 selected="selected" 当前选定对象上的属性 option 元素。似乎这是为了让字段自动完成。这是一个特性,而不是一个bug。
快速解决方法是简单地添加 autocomplete="off" 财产 select 元素-在当前版本的firefox中禁用此行为,例如:

<select id="myBindingPath" name="myBindingPath" autocomplete="off"> 
    <option value = "fizz">fizz</option>
    <option value = "buzz">buzz</option>
    <option value = "bang" selected="selected">bang</option>
</selected>

但谁知道未来版本的firefox将如何处理autocomplete=“off”—所以它不是世界上最强大的解决方案。我还可以编写javascript来更新页面加载时的元素,这可能是一个更健壮的解决方案。
链接:1,2

相关问题