TryUpdateModel忽略Visible中的属性=" false" GridView的列

时间:2015-07-09 11:21:30

标签: c# asp.net gridview webforms model-binding

所以我在这里有我的UpdateMethod:

public void gvProducts_UpdateItem(Int32 ProductID)
{
    ProductListModel model = new ProductListModel();

    Product product = db.Products.Find(ProductID);

    if (product == null)
    {
        // MAF: The item wasn't found
        ModelState.AddModelError("", String.Format("Item with id {0} was not found", ProductID));
        return;
    }

    TryUpdateModel(model);

    if (ModelState.IsValid)
    {
        Mapper.Map(model, product);
        db.SaveChanges();
        gvProducts.EditIndex = -1;
    }
}

使用AutoMapper将ProductList页面的Model映射到Product Entity。 GridView上有很多列,因此我们会根据用户选择显示和隐藏一些列。 我遇到的问题是绑定到Visible =" false"在TryUpdateModel()期间未设置列,因此填充了默认值。这意味着,例如,如果用户没有显示价格详细信息,则他们的价格会在保存时设置为0.

1 个答案:

答案 0 :(得分:0)

事实证明,如果数据库的成本稍高,那么解决方案实际上非常简单。

我们从当前数据库值中获取重新映射模型所需的相关实体,一旦我们从当前数据库值获得模型,我们就可以在该模型上执行更新,这将使Visible =" false& #34;列数与DB值不变。

然后,我们将模型映射回实体,并将其保留为之前的数据库。

public void gvProducts_UpdateItem(Int32 ProductID)
{
    Product product = db.Products
                        .Include(it => it.TaxRate)
                        .Include(it => it.Category)
                        .Include(it => it.Brand)
                        .Include(it => it.Supplier)
                        .Include(it => it.Colour)
                        .FirstOrDefault(it => it.ProductID == ProductID);

    if (product == null)
    {
        ModelState.AddModelError("", String.Format("Item with id {0} was not found", ProductID));
        return;
    }

    ProductListModel model = Mapper.Map<ProductListModel>(product);

    TryUpdateModel(model);

    if (ModelState.IsValid)
    {
        Mapper.Map(model, product);
        db.SaveChanges();
        gvProducts.EditIndex = -1;
    }
}

希望这有助于其他人。