将记录移至存档视图 非软删除

Posted

技术标签:

【中文标题】将记录移至存档视图 非软删除【英文标题】:Move record to Archived View Not soft delete 【发布时间】:2019-11-13 01:44:25 【问题描述】:

我想在表中添加一个存档按钮,因此当单击它时,该行中的数据会移动到另一个名为存档的视图中,我已经确定了编辑和删除所有内容。与软删除不同,记录只会从归档视图的索引。这可能很简单,但我不知道如何。 我不知道我是否需要一个新模型用于存档或我的表中的新列已存档,但正如我所提到的,存档按钮应该只将记录移动到具有所有存档记录的不同视图,也许我需要在数据库中为主表中的所有存档数据创建一个新表。这是我到目前为止所拥有的: 查看:

@model IEnumerable<practice2.Models.Customer>
@


                ViewBag.Title = "Archive";
                Layout = "~/Views/Shared/_Layout.cshtml";


<h2>Archive</h2>
<div class="container">
    <table class="table table-bordered table-hover">
        <thead>
            <tr>

                <th> User Name</th>

                <th>Date Of Birth</th>
                <th>Membership Type</th>
                <th>Email</th>


            </tr>
        </thead>
        <tbody>
            @foreach (var customer in Model)

            
                <tr>
                    <td>@Html.ActionLink(customer.LastName, "Details", "Customers", new  id = customer.Id , null)</td>
                    <td>@customer.DateOfBirth.Value.ToShortDateString()</td>
                    <td>@customer.MembershipType.NameOfMembershipType</td>
                    <td>@customer.EmailAddress</td>


                </tr>
            
        </tbody>
    </table>
</div>

控制器:

  public ActionResult Archive (int? id)
        
            if (id == null)
            
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            
            Customer customer = _context.Customer.Find(id);
            if (customer == null)
            
                return HttpNotFound();
            
            _context.Customer.Move(customer)to archive;// I wish it was       this easy

            _context.SaveChanges();

            return RedirectToAction("Index", "Customers");
        

谢谢……

【问题讨论】:

【参考方案1】:

在我看来,您可以在这里采用 2 种方式,具体取决于您之后想要如何处理数据。按照您的建议创建一个新的存档表,或者只是在您当前的客户表中添加一个额外的列。

如果您创建一个新表,您首先将需要的值从您的客户表复制到您的存档表,然后从客户表中删除数据。

或者,您在 Customer 表中添加一个额外的列,例如IsArchived,并将其设为布尔值(在 Sql 中为位)。将“客户已归档”设置为 true,否则设置为 false。 然后您可以根据此值在不同的 Controller 中过滤您的客户。

如果表中已有数据,请将其设为可为空的 bool (bool?) - (SqL - Allow Null) 并将空值视为 false。

编辑

如果人们有同样的问题:

IN 模型添加:

public bool? IsArchived  set; get; 

Nu-get

Add-migration AddNewColumnToWhatever
Update-database

在控制器中:

public ActionResult Archive(int? id)
        
            if (id == null)
            
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            
            Customer customer = _context.Customer.Find(id);

            if (customer == null)
            
                return HttpNotFound();
            

            customer.IsArchived = true;

            return RedirectToAction("Index", "Customers");


        


        public ActionResult GetCustomers(string typeOfCustomer)
        
            List<Customer> customers = new List<Customer>();

            if (string.IsNullOrEmpty(typeOfCustomer))
            
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            

            if (typeOfCustomer == "archived")
            
                customers = _context.Customer.Include(c => c.MembershipType).Where(x => x.IsArchived == true).Select(x => x).ToList();
            

            else if (typeOfCustomer == "active")
            
                customers = _context.Customer.Include(c => c.MembershipType).Where(x => x.IsArchived == false).Select(x => x).ToList();
            

            else
            
                return HttpNotFound();
            

            return View(customers);
        

为 GetCustomers 创建一个新视图并定义模型:

@model List<YourProject.FolderWhereYourClassIsDefined.Customer>

并按照您的意愿构建您的视图。

在您现有的视图中,放置 2 个按钮来调用新的 ActionResult。

 @Html.ActionLink("View Archived", "GetCustomers", "Customers", new  typeOfCustomer = "archived" , new  @class = "btn" )
@Html.ActionLink("View Active", "GetCustomers", "Customers", new  typeOfCustomer = "active" , new  @class = "btn" )//You don't need it 

现在在索引控制器中执行此操作:

var customer = _context.Customer.Include(c => c.MembershipType)
                .Where(c => c.IsArchived == null)// important
                .Where(c => c.IsArchived == false) // important
                .Include(c => c.CardType)
                .ToList();//to excute query immediatly  

你应该一切都好。 LasseHolm/EndlessQ

【讨论】:

我在模型中创建了这个“public bool?IsArchived set; get; ”。在存档操作中,我更改了“_context.Customer.IsArchived = true;”到“customer.IsArchived = true;”在 GetCustomers 中,当我将其设置为已归档的私有字符串时,它说活动和归档没有任何价值;始终为空。所以在视图中,当我点击“存档”时没有任何反应,当我点击你给我的 btn 时,我得到 404。 意识到我忘记了每个 ToList() 之前的 select 语句 - 请参阅更新的代码。这应该够了吧。对于这两个按钮,如果您使用引导 css,我认为您应该将 @class= “btn” + 任何额外的样式添加到 Line。不是我出于演示目的而放入的“按钮”。同样,您是对的, _context 应该在设置为 true 的部分中省略。远离编辑器时编写代码并不容易...... 哦! 404...您是否创建了一个 GetCustomers 视图来显示 List 非常感谢您的所有帮助。我现在有 2 个问题:1)当我点击存档 btn 时,即使在数据库中检查了 IsArchived,记录也不会从索引中消失,因此存档控制器工作正常。 (2) 在 GetCustomer 视图中,我得到“对象引用未设置为对象的实例”。 @foreach(var customer in Model) 模型的错误为 null,即使它不是..

以上是关于将记录移至存档视图 非软删除的主要内容,如果未能解决你的问题,请参考以下文章

SQL 存档脚本

软删除是个好主意吗? [复制]

使用触发器归档多个表中已删除的记录

删除视图控制器并移至下一个视图控制器

Azure IoT Hub 十分钟入门系列 - 使用消息路由将原始设备数据记录存档

sh 将@done任务纸任务记录到第一天,并归档已完成的任务并清除存档