有没有比隐藏输入字段更安全的替代方法来在 POST 请求中保留属性?

问题描述 投票:0回答:1

我遇到了一个问题,即由于忘记在我的

<form>
标签内添加隐藏字段,我的 CRUD 应用程序中的发布请求导致数据丢失。例如,我有一个 UserModel,它具有 DateCreated 属性,理想情况下不应在创建记录后更新该属性。但我的 CRUD 应用程序内的后续更新导致我的 UserModel 的 DateCreated 字段被设置为 NULL。这是因为在我的 Razor 页面中没有
<input asp-for="Input.DateCreated" hidden />
标签可以跨 POST 请求保留 DateCreated 的值。我犹豫是否接受解决此问题的最佳方法只是记住为您不想更新的每个字段添加隐藏的输入标记。仅仅记住这样做似乎是不必要的风险和糟糕的设计。

一些示例代码:

<form method="post">
    <input asp-for="AspNetUsersId" hidden />
    <input asp-for="Input.DateCreated" hidden />
    <div class="mb-2">
        <label asp-for="Input.Email" class="form-label">Email:</label>
        <input asp-for="Input.Email" type="email" class="form-control form-control-sm" />
        <span asp-validation-for="Input.Email" class="text-danger form-text"></span>
    </div>
    <div class="mb-2">
        <label asp-for="Input.FirstName" class="form-label">First Name:</label>
        <input asp-for="Input.FirstName" class="form-control form-control-sm" />
        <span asp-validation-for="Input.FirstName" class="text-danger form-text"></span>
    </div>
    <div class="mb-2">
        <label asp-for="Input.LastName" class="form-label">Last Name:</label>
        <input asp-for="Input.LastName" class="form-control form-control-sm" />
        <span asp-validation-for="Input.LastName" class="text-danger form-text"></span>
    </div>
</form>

想到的一个解决方案是开始使用 DTO 进行更新,它根本不包含 DateCreated 字段,并且只需要将 Id 属性包含在隐藏字段中,但后来我遇到了一个问题,我必须进行后续查询以获取 UserModel 的其余属性,然后相应地映射它们并将其传递给我的 Update 方法。

或者,我可以编写另一个接受 UpdateUserDto 的更新方法。

使用隐藏输入标签是跨发布请求保留模型属性的最佳方法还是这个问题是更大的架构问题的结果?

c# design-patterns crud razor-pages model-binding
1个回答
0
投票

如果您希望将所有属性都包含在 SQL 更新命令中,则

DbContext.Update
方法非常合适。但是,如果您只想启用对实体中某些属性的修改,建议的解决方案是将实体附加到上下文,然后指定可能已修改的属性。这样,只有这些字段才会包含在生成的 SQL 更新命令中。

context.Attach(myEntity);
context.Entry(myEntity).Property(x => x.Name).IsModfied = true;
context.Entry(myEntity).Property(x => x.Description).IsModfied = true;
await context.SaveChangesAsync();

在隐藏字段中包含其他属性值并不是一个好主意,因为例如熟悉浏览器开发工具的用户可以修改它们。或者任何可以制作 HTTP 请求的人。

© www.soinside.com 2019 - 2024. All rights reserved.