如果禁用的下拉列表动态呈现到页面,仍然可以使用 Firebug 或其他工具来篡改提交的值,并删除“禁用”的 HTML 属性。这段代码:
protected override void OnLoad(EventArgs e) {
var ddlTest = new DropDownList() {ID="ddlTest", Enabled = false};
ddlTest.Items.AddRange(new [] { new ListItem("Please select", ""), new ListItem("test 1", "1"), new ListItem("test 2", "2") });
Controls.Add(ddlTest);
}
导致此 HTML 被呈现:
<select disabled="disabled" id="Properties_ddlTest" name="Properties$ddlTest">
<option value="" selected="selected">Please select</option>
<option value="1">test 1</option>
<option value="2">test 2</option>
</select>
当我使用 Firebug 删除“禁用”属性并更改所选选项时,会出现问题。
在提交表单并重新创建字段时,新生成的控件在 OnLoad 结束时具有正确的值,但通过 OnPreRender,它已假定提交的控件的身份并已被赋予提交的表单值。
.NET 似乎无法检测到该字段最初是在禁用状态下创建的,并且提交的值是伪造的。这是可以理解的,因为可能存在允许删除禁用属性的合法客户端功能。
除了蛮力方法之外,还有其他方法可以检测到该字段的值不应该被更改吗?
我认为蛮力方法是垃圾,比如在 OnLoad 中保存正确的值,并在 OnPreRender 中恢复值。由于某些领域依赖于其他领域,这对我来说是不可接受的。