我认为这种情况非常适合使用淘汰赛的客户端解决方案,正如您在第一个建议的解决方案中提到的那样。Knockout 使得以声明方式进行这种客户端 UI 操作变得非常容易。用户完成表单后,您只需将客户端视图模型对象序列化为 JSON 并将其 POST 到您的服务层。
您提出的第二个解决方案的吸引力要小得多。它的缺点包括:
- 它需要服务器回发只是为了更新 UI,这是一种不太理想的用户体验
- 您的服务器域模型现在必须有一个工作且已提交的模型,这增加了复杂性
使用 MVVM 模式通过敲除和客户端 javascript 视图模型实现这一点的代码非常简单:
<div data-bind = "text: name"></div>
<input type="radio" name="citizenship" value="yes" data-bind="checked: citizenship">South African Citizen<br/>
<input type="radio" name="citizenship" value="nowithoutworkpermit" data-bind="checked: citizenship">Non South African, no work permit<br />
<input type="radio" name="citizenship" value="nowithworkpermit" data-bind="checked: citizenship">Non South African, with work permit<br />
<div id="workpermit" data-bind="visible: citizenship() === 'nowithworkpermit'">
<input type="text" name="workpermitinumber" />Work Permit number
</div>
<script src="/Scripts/knockout-2.2.0.js" ></script>
<script>
var MyApp = MyApp || {};
MyApp.ViewModel = {
citizenship: ko.observable(""),
name: ko.observable("John")
};
ko.applyBindings(MyApp.ViewModel);
</script>
在此示例中,我在 MyApp.ViewModel 中创建了一个视图模型。该模型有两个属性:姓名和公民身份。我已经将“citizenship”属性绑定到单选按钮的“checked”属性,以及显示工作许可证号文本框的“visible”属性。
当用户选中一个单选按钮时,敲除将更新视图模型的“citizenship”属性。视图模型属性中的这种更改将反过来通过淘汰“可见性”绑定更新工作许可 div 的可见性 css 属性。当用户准备好提交表单时,您只需将 MyApp.ViewModel 序列化为 JSON 并通过网络发送。
淘汰赛的文档非常出色(请参见此处),我认为它非常适合您要完成的工作。