0

我正在使用 MVC3 和 EF4 编写 Web 应用程序。我正在使用如下所示的操作标头来捕获用户提交的表单值。

<HttpPost()>
Public Function Edit(ByVal prod as Product) As ActionResult

我使用下面的代码来更新记录。

db.Attach(prod)
db.ObjectStateManager.ChangeObjectState(prod, EntityState.Modified)
db.SaveChanges()

我在数据库中更新了 prod 对象中的提交值。问题是有些用户不允许修改产品中的某些字段,比如 ProductCost。我已禁用 HTML 中此类字段的文本框。但由于它是客户端,用户可以使用 Firebug 等工具轻松启用它并修改值。

我能想到的唯一解决方案是从数据库中检索现有记录并将其 ProductCost 值复制到 prod.ProductCost 中。但我不喜欢为实现这一目标而发起查询。有没有更好的方法来实现这一目标?

编辑:我找到了以下链接来更新特定字段。如何使用实体框架只更新一个字段?

您可以使用以下代码修改特定字段。

context.ObjectStateManager.GetObjectStateEntry(user).SetModifiedProperty("FieldName");

现在的问题是我是否必须为用户能够修改的每个字段编写上述语句?如果是,假设 Product 模型有 10 个字段(1 个主键),并且允许用户修改除主键之外的所有字段,我需要编写 9 条语句?有没有一种方法可以一次指定多个属性。或者甚至更好的是您指定未修改的属性。(注意:我知道我可以在字段名称数组上运行循环以避免编写 9 条语句。我要求另一种方法而不是重构上述方法)

4

1 回答 1

2

永远不要相信客户数据。始终让您的服务器代码验证输入并执行适当的操作。

我会创建我的呼吸方法的单独重载以不同的方式更新产品,然后检查当前用户的访问类型是什么,如果他是管理员,我将调用更新所有内容的重载,如果他是经理,我将调用更新名称、图像网址和价格的方法,如果他是员工,我将调用仅更新名称和图像网址的方法

[HttpPost]
public ActionResult Edit(Product prod)
{
  if(ModelState.IsValid) 
  {
    string userType=GetCurrentUserTypeFromSomeWhere();
    if(userType=="admin")
    {
       repo.UpdateProduct(prod);
    }
    else if(userType=="manager")
    {
       repo.UpdateProduct(prod.ID, prod.Name, prod.ImageUrl, prod.Price);
    } 
    else if(userType=="employee")
    {
       repo.UpdateProduct(prod.ID, prod.Name, prod.ImageUrl);
    } 
    return RedirectToAction("Updated",new {id=prod.ID});
  }

}
于 2012-09-18T20:18:05.417 回答