0

假设我有一个模型:

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”字段为空,因为视图上没有它的元素。

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

4

2 回答 2

0

在表格中也包括您的密钥。这样当回发时,它将在模型/视图模型中可用。您可以为此使用 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

}
于 2012-05-07T18:03:57.513 回答
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()在控制器的 Edit 操作中使用该方法。此帮助函数将值从表单集合复制到模型。无需弄清楚哪些字段是可编辑的,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 });
} 
于 2012-05-07T18:04:55.433 回答