Переместить запись в архивированный вид - PullRequest
0 голосов
/ 02 июля 2019

Я хочу добавить кнопку «Архивировать» в таблицу, чтобы при ее нажатии данные в этой строке перемещались в другое представление, называемое архивом, у меня есть «Правка» и удалялись все выясненные данные. В отличие от «мягкого» удаления, запись будет просто перемещаться из Индекс в архивном виде. Это может быть просто, но я не знаю как. Я не знаю, нужна ли мне новая модель для архива или новый столбец в моей таблице, который говорит, что он заархивирован, но, как я уже говорил, кнопка «Архивировать» должна только переместить запись в другое представление, содержащее все заархивированные записи, возможно, мне нужно создать новую таблицу в базе данных для всех архивных данных из основной таблицы .. вот что у меня есть до сих пор: Вид:

@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 Ответ

1 голос
/ 02 июля 2019

По моему мнению, вы можете пойти двумя путями, в зависимости от того, как вы хотите работать с данными впоследствии. Создайте новую архивную таблицу, как вы предлагаете, или просто добавьте дополнительный столбец в вашу текущую таблицу клиентов.

Если вы создаете новую таблицу, вы сначала копируете необходимые значения из таблицы Customer в таблицу Archive, а затем удаляете данные из таблицы Customer.

Или вы добавляете дополнительный столбец в таблицу Customer, например, IsArchived, и сделайте его bool (немного в SqL). Установите значение true для «Клиент в архиве» или false, если нет. Затем вы можете отфильтровать своих клиентов в разных контроллерах на основе этого значения.

Если у вас уже есть данные в таблице, сделайте ее недействительным bool (bool?) - (SqL - Allow Null) и обработайте нулевые значения как false.

Редактировать

В случае, если у людей тот же вопрос:

В модели ADD:

public bool? IsArchived { set; get; }

Nu-получить

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...