【问题标题】:Disallow concurrent access of a page in ASP.NET MVC [closed]禁止同时访问 ASP.NET MVC 中的页面 [关闭]
【发布时间】:2016-10-11 06:53:42
【问题描述】:

我们有一个使用 ASP.NET MVC 构建的带有多用户管理面板的 Web 应用程序。由于多个用户同时访问同一个页面,只有最后一次编辑和保存的用户数据会被更新到数据库中。这会给其他用户带来问题。

  1. 是否有任何选项可以随时禁止用户同时访问同一页面?如果用户已经在一个页面上工作,系统应该提醒其他试图访问同一页面的用户“其他人正在这个页面上工作。请稍后再试。”
  2. MVC 框架本身或 .NET 身份验证是否为此问题提供了任何工具?
  3. 否则,任何合适的逻辑解决方案也可以。

提前谢谢...

【问题讨论】:

  • 您可以在 Db 级别进行。如果有人已经在编辑页面或表单,只需使用位列来防止并发编辑。在这种情况下,您可以创建另一个或在同一个表中。更新时只需更新第 1 列,完成后更新 0。
  • @AT-2016,如果第一个用户放弃编辑,则不起作用 - 标志永远不会重置,并且没有其他人可以编辑它:)
  • 如果有人访问该页面并且我将位字段更新为 1 并且他没有单击提交按钮就离开了该页面。该页面将无限期地对所有用户不可用。对吗?
  • 这是真的@Stephen Muecke。我实际上正在考虑对 stackoverflow.com 的编辑。当有人已经完成编辑时,该编辑被拒绝。它可能相似,但需要第三人修改。

标签: asp.net-mvc concurrency


【解决方案1】:

创建类似于 sys_forms 的表,该表具有控制器、操作、视图和 isActive 等列

并在需要检查页面是否可用时添加操作过滤器

[PageAvailableFilter]
 public class HomeController : Controller
 {
      public ActionResult Index()
      {
           return View();
      }
 }

并创建 PageAvailableFilter 类继承自 ActionFilterAttribute 并覆盖 OnActionExecuting 方法,因为此方法在控制器中的操作之前调用

public class PageAvailableFilterFilter : ActionFilterAttribute

 {
      public override void OnActionExecuting(ActionExecutingContext filterContext)
      {
           var controllerName = filterContext.routeData.Values["controller"];
           var actionName = filterContext.routeData.Values["action"];
           //here and you logic and query
           if (some_conditions == true)
           {
            filterContext.Result = new RedirectResult("~/MyPage");
            return;
           }
      }
  }

并检查此控制器和操作是否可用,您可以在此类中使用 viewbag 和 viewdata

更多信息阅读更多关于动作过滤器的信息

【讨论】:

  • @freedomn-m 是的,很抱歉我复制了这个并且不要更改类名
猜你喜欢
  • 2023-04-03
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多