0

我们有一个包含大约 25 个字段的表单。下面列出了几个字段。

<div class="form-field">
    @Html.LabelFor(m => m.FormData.FirstName)
    @Html.TextBoxFor(m => m.FormData.FirstName)
</div>
<div class="form-field">
    @Html.LabelFor(m => m.FormData.LastName)
    @Html.TextBoxFor(m => m.FormData.LastName)
</div>
<div class="form-field">
    @Html.LabelFor(m => m.FormData.MiddleInitial)
    @Html.TextBoxFor(m => m.FormData.MiddleInitial, new { @class = "small" })
</div>

我有一个 FormData 对象,它存储表单的值,如果 ModelState 有效,稍后将与 Patient 对象同步。患者存储在会话中。

patient.FirstName = formData.FirstName;
patient.LastName = formData.LastName;
patient.MiddleInitial = formData.MiddleInitial;

目前,每次发布数据时,都会将每个字段保存给患者。有没有办法只保存已更改的项目?或者在这里跟踪变化?我认为这会提高效率?

4

3 回答 3

0

在我看来,过早优化 - http://c2.com/cgi/wiki?PrematureOptimization。在你看到有一些真正的性能损失之前,不要这样做。如果您只保存已更改的项目,我认为您几乎不会注意到一些差异。您很可能会使代码的可读性降低。

于 2012-11-19T22:07:23.617 回答
0

您可以为每个字段编写如下内容:

if( !patient.FirstName.Equals(formData.FirstName, StringComparison.CurrentCultureIgnoreCase)) 
  patient.FirstName = formData.FirstName;

但这不会大大提高效率。这是一个简单的方法。另一种方法是在客户端使用 Javascript 跟踪更改,使用 <input> 元素和其他元素的 onchage 事件,但这更加困难。问题是它需要时间来编程和以后维护它。最简单的方法是使用更改的数据保存未更改的数据。如果会有性能问题,那么您可以进行这些更改。希望这可以帮助。

于 2012-11-19T20:06:47.723 回答
0

真正实现您想要的最佳方式是使用第三方 Javascript 库,例如 Knockout。这基本上是因为服务器不知道用户何时更改了浏览器中的某些内容,除非他“提交”了一些数据。要使用 KO.JS,您还需要传达 MVVM 方法。

然后,您可以执行以下操作:

@Html.TextBoxFor(m => m.FormData.LastName, new { data-bind="value: lastName"})

JS 代码将如下所示:

var ViewModel = function(first, last) {
    this.firstName = ko.observable(first);
    this.lastName = ko.observable(last);

    this.fullName = ko.computed(function() {
        return this.firstName() + " " + this.lastName();
    }, this);
};

ko.applyBindings(new ViewModel("FirstName", "LastName")); ​

这是一个很好的例子,它使用 Knockout 在数据发生变化时处理数据:

http://jsfiddle.net/rniemeyer/LkqTU/

于 2012-11-19T20:18:03.610 回答