如何在ASP.NET Core应用程序中仅从KendoUI网格更新已修改的字段?

在我的ASP.NET Core应用程序中,我使用的是来自Progress的KendoUI。特别是,我使用的网格允许对数据进行基本的操作。我正在为CRUD操作和SQL视图使用存储库模式。

问题

我遇到的问题是,当我更新网格行时,“视图”实体被传递到控制器中。然后,我尝试拆分该实体以更新两个相关表(有关此示例,请参见下面的更新方法),这意味着,由于硬类型定义,任何更新的记录也将具有提交的'null'值。

为什么存在此问题?

从我所看到的是,我的方法是错误的,退出存储库模式,然后定义“ Vessel”和“ Position”,并明确指定它们的值,这打破了EntityFrame的“ Update”对“ Context”的智能”,它不能/不会仅更新那些已编辑的字段。如果这是一次只有一个实体类负责的单项更新,则存储库将正常工作,并且仅更新已编辑的字段。

我的问题是我该怎么做才能使我的方法更好,并且只更新那些已经在网格中更新的字段,同时告诉我的代码更新两个表?

有些人可能会建议使用Automapper或类似的东西,但如果可能的话,我宁愿避免使用该插件。

设置

我的KendoUI标签帮助器网格从我的控制器读取数据,该控制器通过我注入的服务访问我的存储库,我的存储库使用一个实体类,该实体类装饰有“表”声明,该声明查看数据库中的SQL视图。该视图的目的是将多个表连接在一起并显示一组特定的数据。我更喜欢这种替代方法,而不是使用LINQ在控制器中创建很多联接。

Home.chtml

这是使用标签助手生成的网格。您可以看到在传输模块中定义了读取和更新方法,并在控制器中找到了它们的相对路径。

<kendo-grid name="positions" deferred="true">
    <datasource type="DataSourcetagHelperType.Ajax" page-size="100">
        <transport>
            <read url="/Home/ReadPositions" />
            <update url="/Home/EditPosition" />
        </transport>
        <schema>
            <model id="Id">
                <fields>
                    <field name="Id" editable="false"></field>
                    <field name="Name"></field>
                </fields>
            </model>
        </schema>
    </datasource>
    <editable mode="popup" />
    <groupable enabled="true" />
    <sortable enabled="true" />
    <filterable enabled="true" />
    <columns>
        <column field="Id" title="Id" width="100" />
        <column field="Name" title="Name" />
        <column field="IMO" title="IMO" />
        <column field="Prompt" title="Prompt"  />
        <column field="Sublet" title="Sublet" />
        <column field="Region" title="Region" />
        <column>
            <commands>
                <column-command text="Edit" name="edit"></column-command>
                <column-command text="Delete" name="destroy"></column-command>
            </commands>
        </column>
    </columns>
</kendo-grid>

HomeController.cs

这是上面的网格从中读取的控制器。使用剑道“ DataSourceRequest”。正如您从存储库服务名称中看到的那样,它使用的是专门从SQL视图读取的服务。

public IactionResult ReadPositions([DataSourceRequest]DataSourceRequest request)
{
    var data = _viewPositionService.GetViewPositions();
    var result = data.ToDataSourceResult(request);
    return Json(result);
}

这种方法,尽管对于我所遇到的问题而言功能不正确。

[HttpPost]
public IactionResult EditPosition([DataSourceRequest] DataSourceRequest request,ViewPosition position)
{
    if (position != null && ModelState.IsValid)
    {
        //Update Vessel
        _vesselService.UpdateVessel(new Vessel
        {
            Id = position.Id,Name = position.Name,IMO = position.IMO
        });
        //Update Position
        _positionService.UpdatePosition(new Position
        {
            Id = position.PositionId,Prompt = position.Prompt,Sublet = position.Sublet,Region = position.Region
        });
    }
    return Json(new[] { position }.ToDataSourceResult(request,ModelState));
}

Repository.cs

这是我存储库中的更新方法。

public void Update(TEntity entity)
{
    if (entity == null)
    {
        throw new ArgumentNullException("entity");
    }
    _dbContext.Update(entity);
    _dbContext.SaveChanges();
}

感谢任何帮助或指导。

zyf12345678 回答:如何在ASP.NET Core应用程序中仅从KendoUI网格更新已修改的字段?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3144943.html

大家都在问