ASP.NET MVC;一次只能为一名用户编辑选项

2024-02-08

我有一个表,其中包含三个字段和一些记录。如果用户要编辑表中的记录,则不允许其他用户同时编辑该记录。我可以采取哪些步骤来实现这一目标?


许多具有桌面应用程序背景的人会想知道这是如何在 Web 应用程序中完成的。

锁定记录标志

桌面世界中的一种方法是在行上有一个布尔列,指示它正在被编辑以及由谁编辑。您当然可以使用网络应用程序执行此操作,但这是一种非常糟糕的方法,因为如果用户访问编辑页面,将记录置于锁定状态,然后离开该页面,它将永远处于锁定状态。您没有明确的方法来判断用户尚未打开编辑页面。

时敏锁

航空公司预订方法是上述方法的变体,但您还会有一个 LockedUntilUtc,它是一个日期时间,指示记录锁定多长时间。假设 Bob 访问一个页面以获取记录,当通过 GET 操作提供 apge 时,您还设置了锁定标志,并将 LockedUntilUtc 设置为未来 10 分钟。 5 分钟后,Sarah 访问该页面,但收到“当前锁定”错误,因为您检查了 LockedUntilUtc 并且它当前处于未来状态。又过了 6 分钟(自锁定以来总共 11 分钟),有人访问该页面,LockedUntil 已过去,因此您将锁定授予新用户。

这似乎是一个合理的妥协,但它充满了肯定会让用户感到沮丧的问题。首先,没有简单的方法可以对需要访问权限以编辑记录的用户进行排队。 Sarah 可以尝试 10 次,然后就过了 10 分钟,Jimmy 访问了该页面,因为他是锁过期后第一个访问的人,所以他在 Sarah 没有机会的情况下抢到了下一个锁。 Sarah 致电您的服务台,并表示她等了 10 分钟锁才过期,而现在已经过去 15 分钟了,她仍然无法访问该页面。您的服务台可能怀疑她是否真的等了整整 10 分钟,然后来来回回。

您还必须为当前拥有锁的人实现客户端计时器/显示,以便他们知道在锁过期之前还剩下多少时间。

乐观并发

在大多数情况下这是正确的方法。您实际上根本不以任何方式锁定记录。相反,许多用户可以访问编辑页面。当他们保存编辑时,表单包含原始值和新编辑的值。服务器会将表单中的原始值与数据库中的当前值进行比较,以查看是否存在临时编辑。

The original值来自过去的某个时刻(当 Bob 最初访问编辑页面时)。这current价值观是从现在开始的。从过去到现在,如果 Sarah 也访问过编辑页面,并成功保存了对数据库值的更改,那么 Bob 的original值将不同于current数据库中的值。因此,当 Bob 尝试保存他的更改时,服务器将看到他的更改original值不同于currentDB 中的值,并抛出错误。您需要决定如何处理这种情况。通常,您让用户知道其他人已经编辑了该页面,然后刷新页面,他们就会丢失所做的编辑。实体框架支持乐观并发。

Ajax 化乐观并发

您还可以让客户端偶尔使用原始值 ping 服务器,以便服务器可以检查您的页面是否过时(即其他用户更改了某些内容)并弹出一条消息。这可以通过提前通知用户其他用户已编辑该页面来改善用户体验。因此,他们在进行编辑方面并没有取得多大进展,无论如何他们都会丢失这些编辑。他们还可以在浏览器中记下/复制/粘贴他们的编辑,以便刷新页面并参考他们更改的内容。

SQL Server 中有一个时间戳列,它可以与实体框架协同工作,以降低检查更改所涉及的开销。这样您就不需要在每个客户端中保留原始值的完整记录并将它们来回传递:http://www.remondo.net/entity-framework-concurrency-checking-with-timestamp/ http://www.remondo.net/entity-framework-concurrency-checking-with-timestamp/

细粒度编辑

我们经常使用的一种方法是对每个字段进行 ajax 化,并立即提交对单个字段的编辑。这是使用名为 x-editable 的 jquery 库来完成的。用户编辑单个字段,确认编辑,然后将该值发送到服务器。如果您想检查整个记录或仅检查单个字段的更改,可以将其与乐观并发结合起来。如果检测到更改,则您拒绝编辑并刷新页面。这对于用户来说可能是一种更加友好的体验,主要是因为用户在编辑单个字段时会立即收到“另一个用户编辑的页面”错误。这可以防止他们浪费大量时间编辑大量字段,却发现他们的编辑被拒绝,他们不得不再次重做所有编辑。相反,他们编辑单个字段,收到错误,页面刷新,他们只需重复该字段编辑并从那里继续.

http://vitalets.github.io/x-editable/demo-bs3.html http://vitalets.github.io/x-editable/demo-bs3.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET MVC;一次只能为一名用户编辑选项 的相关文章

  • ASP.NET MVC 和 Expression XAML - 如何集成?

    一些背景 ASP net MVC 主要是构建和开发 ASP NET 应用程序方式的范式转变 从 代码隐藏 类型的心态转变为更像标准 MVC Ruby on Rails 的心态 我赞扬它作为一种简化工具来简化单元测试和代码分离 尽管 html
  • 如何使用PostGIS将多边形数据转换为线段

    我在 PostgreSQL PostGIS 中有一个多边形数据表 现在我需要将此多边形数据转换为其相应的线段 谁能告诉我如何使用 PostGIS 查询进行转换 提前致谢 一般来说 将多边形转换为线可能并不简单 因为没有一对一的映射 http
  • ASP.NET MVC 应用程序中的工作单元模式

    我一直在看这个优秀的blog http www nhforge org wikis patternsandpractices nhibernate and the unit of work pattern aspx标题为 NHibernat
  • 分层查询

    我希望我能够解释困扰我的问题 我有以下分层数据集 这只是 34K 记录的子集 PARENT ID CHILD ID EXAM TUDA12802 TUDA12982 N TUDA12982 TUDA12984 J TUDA12984 TUD
  • 使用 JSON 参数的 Postgres 批量 INSERT 函数

    这是一个plpgsqlpostgres 的函数9 6 它试图INSERT一行 如果插入没有失败 由于违反键约束 那么它会运行更多命令 CREATE FUNCTION foo int text text RETURNS void AS BEG
  • Mysql 中 UNION 子句的替代方案

    我有两张桌子 表 a 表 b table a ID 1 2 3 4 5 7 table b ID 2 3 4 5 6 我必须得到这样的输出而无需UNION命令 ID 1 2 3 4 5 6 7 注意 我有一个联合解决方案 select fr
  • 在sqlite SQL语句中与order by子句结合使用limit

    下面的两条 SQL 语句总是会产生相同的结果集吗 1 SELECT FROM MyTable where Status 0 order by StartTime asc limit 10 2 SELECT FROM SELECT FROM
  • 列中差异的数量

    我想检索一列每行中有多少个字母的差异 例如 如果您有一个值 test 而另一行有一个值 testing 则 test 和 testing 之间的差异为 4 个字母 该列的数据值为 4 I have reflected about it an
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • sql server 按组排名

    问题看似简单 但我却无法理解 这是针对 sql 服务器的 what I have in a table What I need as a output cksum id cksum id 2162514679 204 2162514679
  • 使用 where 进行 select 语句时,HSQLDB 用户缺乏权限或未找到对象错误

    我的数据库使用 SQuirrel SQL 客户端版本 3 5 3 和 HSQLDB 我已经能够为其指定相应的驱动程序 内存中 并创建一个别名 我创建了一个表 CREATE TABLE ENTRY NAME VARCHAR 100 NOT N
  • 跨多个表进行搜索,并在结果行中显示表名称

    如何构建 SQL 语句以跨多个平面不相关的表运行 并使用选择结果和结果来自的表的名称显示结果 这种情况是这样的 我有几个表 每个表都有相同的列名 这是我从外部各方收到的数据 并将其存储在不同的表中 相同的表看起来像 Table 1 pid
  • 为表中的每个组选择前 N 行

    我面临一个非常常见的问题 即 为表中的每个组选择前 N 行 考虑一个表id name hair colour score列 我想要一个结果集 对于每种头发颜色 都能得到前 3 名得分手的名字 为了解决这个问题 我得到了我所需要的Rick O
  • 为什么我可以像调用实例方法一样调用类方法?

    我正在查看这个例子 class SQLObject def self columns return columns if columns columns DBConnection execute2 lt lt SQL first SELEC
  • XML 解析:格式良好的检查:未声明的实体

    我正在使用 SSMS 2008 但收到以下错误 你知道这意味着什么吗 Msg 9448 Level 16 State 1 Line 4 XML parsing line 1 character 89 well formed check un
  • 执行带有 EXCEPTION 的 PostgreSQL 查询会导致两条不同的错误消息

    我有一个 PostgreSQL 查询 其中包含事务和列重复时的异常 BEGIN ALTER TABLE public cars ADD COLUMN top speed text EXCEPTION WHEN duplicate colum
  • SQL不允许表中有重复记录

    如何使其不添加重复项 我想让它通过 ID 之外的所有其他列进行检查 我希望这个无效 ID col1 col2 col3 1 first middle last ID col1 col2 col3 2 first middle last 我希
  • 如何在NiFi中映射流文件中的列数据?

    我有 csv 文件 其结构如下 Alfreds Centro Ernst Island Bacchus Germany Mexico Austria UK Canada 01 02 03 04 05 现在我必须将这些数据移入数据库 如下所示
  • SQL - != 'NULL' 的解释

    我的SSMS代码如下 Select top 50 From FilteredContact Where statuscode 1 and emailaddress1 NULL and telephone1 NULL and address1
  • 如何获得顶部带有千位分隔符的数字?

    SELECT count FROM table A 假设结果是8689 我怎样才能将它转换为8 689在 SQL Server 上 尝试这样 select replace convert varchar convert Money coun

随机推荐

  • 最小覆盖和功能依赖性

    考虑到以下功能依赖性 我将如何计算最小覆盖范围 A gt B ABCD gt E EF gt GH ACDF gt EG 在讲义中 它给出了最小覆盖率的推导 但我不明白它 例如为了摆脱ACDF gt E A gt B gt AACD gt
  • 更改 Android 操作栏按钮样式

    我目前正在改变对我的看法ActionBar MenuItem像这样 MenuItem menuItem menu add title TextView tv new TextView context tv setTypeface myTyp
  • Xamarin Forms 选择器的默认值

    我想在打开页面时获取第一个数据 但没有 我不知道我哪里犯了错误 有人可以帮忙吗 这是我的守则 Xaml
  • 按嵌套属性对对象的对象进行排序

    我有一个如下所示的对象 如何根据嵌套对象中的公共属性对类似的内容进行排序 我期望的输出是玩家 2 根据较高的分数排在第一位 我的挑战是访问每个对象的属性进行排序 这是我的想法和尝试 但它没有进行排序 Object keys data sor
  • 奇怪的错误 C2275 ...非法使用此类型作为具有成员函数模板和 lambda 的表达式

    Summary 由于某种原因 我调用 lambda 函数的成员函数模板无法编译错误 C2275 非法使用此类型作为表达式 但是当该函数被移出为自由函数时 它可以正确编译 Details 首先我有一个基类function中的实例vector
  • “未知”PHP 错误 - 这是什么意思? [复制]

    这个问题在这里已经有答案了 可能的重复 如何修复 PHP 中的 标头已发送 错误 https stackoverflow com questions 8028957 how to fix headers already sent error
  • 使用 Jackson JSON 在 Spring MVC 中解析 JSON

    好吧 我已经研究这个有一段时间了 不再继续了 我有一个 Spring MVC servlet 我需要从 JavaScript 前端 Web 应用程序接受 JSON 为了解析 JSON 我需要使用 Jackson 我需要获取 JSON 中的值
  • 使用 Xamarin.Forms(xaml 和 c#)创建超链接

    我基本上想使用标签类在 Xamarin Forms 中创建超链接 基本上 我想通过以下链接将用户带到网络浏览器中的 google com
  • 在调试模式下调用函数时,GDB 崩溃

    我正在尝试使用 MinGW 在 Windows 上制作一个 C 程序 构建的程序运行正常 但是在调试时出现问题 调试时 如果我尝试检查函数或方法的执行结果 如下面的屏幕截图 GDB 会被强制终止 我已经将 GDB 作为命令行运行 但结果是相
  • 如何调用 sqlite3_errmsg 了解 sqlite3_prepare_v2 失败的原因

    基于C的函数sqlite3 prepare v2返回 1 我只是想以可读的形式了解错误消息并更正我的代码 我是从 raywinderlich 博客中将其作为教程学习的 我遇到过sqlite3 errmsg我不知道如何使用sqlite3 er
  • SensorManager:一个 SensorEventListener VS 多个侦听器

    我正在尝试将传感器测量结果记录到设备内存中 为此 我为许多传感器注册相同的 SensorEventListener 然后根据类型使用开关将它们分开 E g int type sensor getType switch type case S
  • 在 npm 构建期间找不到模块 @restart/context/forwardRef

    我最近开始遇到问题npm build升级到较新版本后react bootstrap 1 0 0 beta 6 Creating an optimized production build Failed to compile Cannot f
  • 从 Cordova 2.5 升级到 Cordova 3.0,在使用 CordovaInterface 时遇到问题

    我正在将我的项目从 Cordova 2 5 迁移到 Cordova 3 遵循中提到的迁移过程 http cordova apache org docs en 3 0 0 guide cli index md html http cordov
  • 从电子邮件中删除无效字符

    我想帮助用户在电子邮件输入中错误地输入无效字符 服务器端验证 清理前 注意 我不在前端验证电子邮件 只是清理 Coffeescript Element find input type email on change keyup event
  • Frederickson堆选择算法简单解释

    Frederickson 的堆选择算法是否有任何简单的解释 可以在 O k 时间内找到在线任何地方可用的最小堆中的第 k 个排序元素 如果没有 任何人都可以解释该算法的内部原理吗 尝试谷歌搜索 frederickson heap selec
  • 如何将自定义默认生成操作关联到 Visual Studio 中的自定义文件类型?

    我有一个为自定义文件类型构建的语言服务 此外 我还在 MSBuild 项目文件中创建了一个自定义目标 构建操作 但是 我无法找到任何方法将该构建操作默认关联到我的自定义文件扩展名 例如 如果添加 cs 文件 则构建操作默认为 编译 我想为我
  • php strip_tags 删除所有内容

    我在用户输入上使用 strip 标签来删除所有可能的标签 但 strip tags php 函数也会删除 例如 某些用户可能会使用表情符号 gt 或者这甚至可以在算法等时使用 是否有任何解决方案允许带状标签上的 问题是在这种情况下 foo
  • MySQL 工作台插入

    我正在使用 MySQL Workbench 5 2 28 来设计我的数据库架构 我需要将默认数据插入到一些表中 这可以使用 插入 选项卡来完成 然而 它似乎只允许手动输入数据 一次一行 我有一个包含数百行的 OUTFILE 我想插入这些行
  • React SetState 不调用 render

    我将我的函数发送到子组件callBack 在父级中 我有一个函数setState method onInputUpdated id var array let char id slice 1 console log this state s
  • ASP.NET MVC;一次只能为一名用户编辑选项

    我有一个表 其中包含三个字段和一些记录 如果用户要编辑表中的记录 则不允许其他用户同时编辑该记录 我可以采取哪些步骤来实现这一目标 许多具有桌面应用程序背景的人会想知道这是如何在 Web 应用程序中完成的 锁定记录标志 桌面世界中的一种方法