javascript - 如何从 asp.net 核心 View 更新 javascript 中的模型值

标签 javascript c# asp.net-core

我正在尝试将子实体(单位)拖放到不同的 parent (用户)。如何在 javascript 放置事件中访问相应的子实体并更新其父实体?

@foreach (var user in Model.Users)
{
    <div class="card w-75">
        <div class="card-body" id="@user.Id">
            <ul class="list-group list-group-flush" ondragover="allowDrop(event)" ondrop="drop(event)">
                <li class="list-group-item">Units</li>
                @foreach (var unit in user.Units)
                {
                    <li class="list-group-item" draggable="true" ondragstart="drag(event)" id="@unit.Id">@unit.Id</li>
                }
            </ul>
        </div>
    </div>
}

<script>
    function drag(ev) {
        ev.dataTransfer.setData('text/html', ev.target.id);
    }

    function drop(ev) {
        ev.preventDefault();
        var data = ev.dataTransfer.getData('text/html');
        if (ev.target.localName == 'li') {
            ev.target.insertAdjacentElement('afterend', document.getElementById(data));
            @Model.Units.First(u => u.Id == data).OwnerId = ev.target.parentElement.parentElement.ID;
        }
        document.forms[0].submit();
    }
</script>

变量“数据”不能像这样访问,我不知道我是否可以首先调用@Model。

最佳答案

I don't know if I can call into @Model in the first place.

您不能直接这样做。 @Model.Units.First(u => u.Id == data).OwnerId = ev.target.parentElement.parentElement.ID;在服务器端运行。在有人拖放 <li> 之前元素,服务器端代码已经执行(呈现)。 不可能让它们在客户端运行

为了实现您的目标,您需要发送 HTTP当有人拖放 <li> 时向服务器请求元素。为了避免过多的 HTTP 请求,您可以创建一个 modelCache存储 Unit-Owner 的变量 map ,并更改此 modelCachedrop(ev)功能:

<script>
    var modelCache = @Html.Raw(JsonConvert.SerializeObject(
        Model.Units.Select(u => new { UnitId = u.Id , OwnerId = u.OwnerId})
    ));

    function drag(ev) {
        ev.dataTransfer.setData('text/html', ev.target.id);
    }

    function drop(ev) {
        ev.preventDefault();
        var data = ev.dataTransfer.getData('text/html');
        let ownerId= ev.target.parentElement.parentElement.id
        if (ev.target.localName == 'li') {
            ev.target.insertAdjacentElement('afterend', document.getElementById(data));
            modelCache.filter(u => u.UnitId == data)[0].OwnerId = ownerId; 
        }
        console.log(modelCache);
        // when you decide to submit, send the modelCache to the server action : `UpdateUnitOwner(modelCache)`
        // document.forms[0].submit();
    }
</script>

最后,您需要一个服务器端操作/处理程序来接收 ajax 请求:

IActionResult UpdateUnitOwner(List<UnitOwnerMap> maps)
{ 
    // ...  update the databse
}

通过这种方式,您可以更新 Unit-Owner通过简单的拖放来建立关系。

关于javascript - 如何从 asp.net 核心 View 更新 javascript 中的模型值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57797668/

相关文章:

javascript - 如何随机化这种两个不同的javascript数组

javascript - 基于主机域限制 iframe cookie

javascript - 如何向 requirejs r.js 优化器添加仅在构建期间运行的插件?

c# - 资源字典中的元素已经是另一个元素的子元素?

c# - 如何使用 Swagger 生成选项(CORS)

javascript - 如何使用 Jest 模拟 es6 类

c# - 在 .NET 2.0 中序列化为 JSON

c# - 使用 .NET 程序集的 Delphi 出现 OLE 错误 8013150A(以管理员身份运行奇怪)

c# - 减少/删除 ASP.NET Core 中重复的业务逻辑检查

c# - 如何将 ModelExpression 绑定(bind)到 ASP.NET Core 中的 ViewComponent?