【问题标题】:How to tell if user changed a property in the view model如何判断用户是否更改了视图模型中的属性
【发布时间】:2015-03-23 07:22:10
【问题描述】:

在我的 MVC POST 例程中,我可以查看哪些内容(可能与 ModelState 相关?)让我知道用户是否更改了任何模型属性?换句话说,用户在表单上输入的值是否与填充视图模型并呈现表单的 GET 操作提供的值不同?

【问题讨论】:

  • 不行,您需要重新获取原件并比较值。
  • 这不是处理程序或控制器的真正工作。将其分配给 EF 实体,更改跟踪器可能会为您提供帮助(我不确定它是否可以通过属性访问)。
  • 好的...因此,在我的 POST 例程中,我将每个模型变量分配给其关联的 EF 实体属性,然后调用 dbContext.SaveChanges。在更新 EF 实体属性(值可能未更改)和调用 SaveChanges 之间,我如何询问 DbContext 是否已更改任何值?
  • dbContext.ChangeTracker.HasChanges(); 是否按照其名称和文档的含义进行操作?看起来我应该能够查询 HasChanges 方法以查看用户是否更改了任何原始值...
  • 经过测试dbContext.ChangeTracker.HasChanges() 似乎正是我想要的:如果用户更改了任何实体值,它返回true。感谢您在正确的方向上给我一个快速的踢。我将发布我自己问题的答案。

标签: asp.net-mvc


【解决方案1】:

在通常情况下,GET 例程从“实体”对象(通过 EF 连接到数据存储的 POCO)读取值,将值写入视图模型,并显示其编辑器已预先填充的视图来自视图模型的值。

用户 POST 回 POST 操作例程,该例程接收包含用户值的填充视图模型。为了检测用户是否更改了任何值,请更新实体并检查DbContext.ChangeTracker.HasChanges(),如下所示:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> EditPersonalInfo(SomeViewModel model)
    // Get the entity record to be updated
    var user = {Get currently logged in ApplicationUser}

    // Update the entity record.  The model values may or may not be
    // identical to the existing entity values
    user.SomeProperty = model.SomeProperty;
    user.AnotherProperty = model.AnotherProperty;

    // Get the DbContext
    var db = HttpContext.GetOwinContext().Get<ApplicationDbContext>();

    // Have any entity values been changed?
    if (db.ChangeTracker.HasChanges()) {
         // Save the changes
        await db.SaveChangesAsync();

        // Tell the user the data was changed...
        <...>
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    相关资源
    最近更新 更多