Asp.net MVC сохранить положение перетаскиваемого элемента - PullRequest
0 голосов
/ 01 ноября 2018

Я делаю что-то вроде списка «Делать», где пользователь может взять текст и перетащить в две таблицы «сделать» и «сделано». Сначала он может создать заметку. Все данные находятся в БД.

model IEnumerable<ToDoList.Models.KtoCo>

@{    ViewBag.Title = "Index"}
<h2>Index</h2>

<p>
@Html.ActionLink("Create New", "Create")
</p>

<!DOCTYPE HTML>
<html><head><style>#div1, #div2 {
        float: left;
        width: 500px;
        height: 500px;
        margin: 10px;
        padding: 10px;
        border: 1px solid black;
    }
</style>
<script>
    function allowDrop(ev) {
        ev.preventDefault();
    }

    function drag(ev) {
        ev.dataTransfer.setData("text", ev.target.id);
    }

    function drop(ev) {
        ev.preventDefault();
        var data = ev.dataTransfer.getData("text");
        ev.target.appendChild(document.getElementById(data));
    }
</script>

@foreach (var item in Model)
{
    <div draggable="true" ondragstart="drag(event)" id=@item.Id width="88" height="31">

        @Html.DisplayFor(modelItem => item.Kto)
        @Html.DisplayFor(modelItem => item.Co)

        @Html.ActionLink("Edit", "Edit", new { id = item.Id }) |
        @Html.ActionLink("Delete", "Delete", new { id = item.Id })
    </div>

}


<div id="div1" ondrop="drop(event)" ondragover="allowDrop(event)"> </div>
<div id="div2" ondrop="drop(event)" ondragover="allowDrop(event)"></div>

`

Это мой взгляд. А вот и модель:

namespace ToDoList.Models
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.Spatial;

[Table("KtoCo")]
public partial class KtoCo
{
    public int Id { get; set; }

    [StringLength(50)]
    public string Kto { get; set; }

    public string Co { get; set; }
}
}

Вопрос: есть ли возможность хранить заметки в таблицах даже после обновления сайта?

P.S. Я знаю, что вид не очень красивый, я буду работать над этим позже.

1 Ответ

0 голосов
/ 01 ноября 2018

Я уверен, что было бы несколько способов сделать это.

Концептуально, вам нужно сохранить на сервере, какие элементы были перетащены в какой список. Затем при загрузке страницы вам необходимо проверить эти списки на стороне сервера, чтобы определить, какие элементы отображать в каких списках.

Ниже приведен просто псевдокод - он вряд ли компилируется и не является полным, но, надеюсь, этого достаточно, чтобы вы начали и получили идею.

Для хранения «капель»: В методе Javascript drop(ev) выполните асинхронный пост-запрос к действию контроллера, отправив идентификатор отброшенного элемента и идентификатор списка, в который он был отброшен. Затем вам нужно будет где-то хранить эту информацию, чтобы при следующем отображении страницы вы могли получить ее. Возможно, в переменной Session.

Ваш метод действия может выглядеть примерно так:

    public ActionResult PutItemInList(int listId, int itemId)
    {
        if (listId == ToDoList)
        {
            var toDoIds = (List<int>)Session["ToDoIds"];
            toDoIds.Add(itemId);
            Session["ToDoIds"] = toDoIds;
        }
        if (listId == DoneList)
        {
            var doneIds = (List<int>)Session["ToDoIds"];
            doneIds.Add(itemId);
            Session["DoneIds"] = doneIds;
        }
    }

Для отображения страницы: Вам нужно будет использовать информацию из переменной Session для визуализации представления.

Добавить новый класс ViewModel, который будет хранить:

  1. список KtoCo (ваш текущий ViewModel)
  2. список идентификаторов в списке задач
  3. список идентификаторов в списке Готово

Примерно так:

public class ToDoViewModel
{
    public List<KtoCos> KtoCos { get; set; }
    public List<int> ToDoList { get; set; }
    public List<int> DoneList { get; set; }
}

В вашем методе действия, который визуализирует View, получите информацию из Session и создайте новый класс ViewModel. Примерно так:

    public ActionResult ActionMethod()
    {
        var toDoIds = (List<int>)Session["ToDoIds"];
        var doneIds = (List<int>)Session["DoneIds"];

        var viewModel = new ToDoViewModel();
        viewModel.DoneList.AddRange(doneIds);
        viewModel.ToDoList.AddRange(toDoIds);
        viewModel.Ktos = GetFromDbSomehow();
        return View(viewModel);
    }

Затем в представлении Razor, модель которого теперь является новым классом ViewModel, проверьте эти свойства списка, чтобы отобразить элементы в правильном месте.

Примерно так:

@foreach (var item in Model.KtoCos)
{
    <div draggable="true" ondragstart="drag(event)" id=@item.Id width="88" height="31">

        @Html.DisplayFor(modelItem => item.Kto)
        @Html.DisplayFor(modelItem => item.Co)

        @Html.ActionLink("Edit", "Edit", new { id = item.Id }) |
        @Html.ActionLink("Delete", "Delete", new { id = item.Id })
    </div>

}

<div id="div1" ondrop="drop(event)" ondragover="allowDrop(event)">
    @foreach (var item in Model.ToDoList)
    {
        <div>@item.SomeInfo</div>
    }
</div>
<div id="div2" ondrop="drop(event)" ondragover="allowDrop(event)">
    @foreach (var item in Model.DoneList)
    {   
        <div>@item.SomeInfo</div>
    }
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...