EF 4:仅基于视图中存在的字段更新模型

时间:2012-05-07 18:00:45

标签: c# asp.net-mvc entity-framework

说我有一个模特:

public class HashTable {
   public string sKey { get;set; }
   public string sValue { get:set; }
}

然后我在视图中渲染它:

<div>Please enter the key/value pair:</div>
@Html.LabelFor(h => h.sKey, "Key");
@Html.TextBoxFor(h => h.sKey);
@Html.LabelFor(h => h.sValue, "Value");
@Html.TextBoxFor(h => h.sValue);

然后我把它保存在控制器中:

db.HashTable.Add(themodel);

然后我在一个视图中回忆起它,但我只想更改值:

<div>Please enter the value:</div>
Key: @Model.sKey
@Html.LabelFor(h => h.sValue, "Value");
@Html.TextBoxFor(h => h.sValue, Model.sValue);

然后我将其提交给控制器。问题是如果我这样做:

db.Entry(oldmodel).CurrentValues.SetValues(themodel);

它使“key”字段为空,因为视图中没有元素。

这是一个非常复杂系统的一个非常简单的例子(代码可能并非完全准确),其中某些表单字段可能会或可能不会根据故障单的状态显示在视图中。我真正需要的是一种方法来使它如果表单字段没有显示在视图中,它不会在数据库中更新。有任何想法吗?提前谢谢!

2 个答案:

答案 0 :(得分:0)

也在表单中包含您的密钥。因此,当回发时,它将在model / viewmodel中可用。您可以使用Html.HiddenFor帮助方法。

<div>Please enter the value:</div>
Key: @Model.sKey
@Html.LabelFor(h => h.sValue);
@Html.TextBoxFor(h => h.sValue);
@Html.HiddenFor(x=>x.sKey)

编辑:如果您不希望在视图中显示这么多字段,但仍希望使用有效的现有数据进行保存,我将获得该条目的ID(例如:ProductId )在我看来并使用该Id来构建现有的Product对象并将新的更改应用于该对象并保存。像这样的事情

<div>Please enter the value:</div>
Key: @Model.sKey
@Html.LabelFor(h => h.ProductPrice);
@Html.TextBoxFor(h => ProductPrice);
@Html.HiddenFor(x=>x.ProductId)

并且操作方法看起来像

[HttpPost]
public ActionResult Edit (ProductViewModel newModel)
{
  var oldProduct=repositary.GetProduct(newModel.ProductID);
  oldProduct.ProductPrice=newModel.ProductPrice;

  //Now save the oldProdcut

}

答案 1 :(得分:0)

首先,您需要将主键呈现为隐藏元素。

<div>Please enter the value:</div> 
Key: @Model.sKey 
@Html.HiddenFor(h => h.sKey) 
@Html.LabelFor(h => h.sValue); 
@Html.TextBoxFor(h => h.sValue); 

然后在控制器的“编辑”操作中使用UpdateModel()方法。 This helper function copies the values from the form collection to the model。没有必要确定哪些字段是可编辑的,因为UpdateModel会为您执行此操作。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formValues)
{
    HashTable hash = repository.GetHashTable(id);
    UpdateModel(hash);
    repository.Save();
    return RedirectToAction("Details", new { id = hash.DinnerID });
}