我们有一个表单,根据我们想要在同一表单中的添加操作和更新操作之间切换的情况。以下是我们表格的简化版本。
有效地,“订单号”文本框被禁用,永远不能以此形式进行编辑。现在,情况有点像这样:
现在有些代码:
观点:
<%: Html.TextBox("OrderNumber", Model.OrderNumber == 0 ? "" : Model.OrderNumber.ToString(), new { @disabled = "true" })%>
控制器:
public ActionResult Index()
{
var customerOrderModel = new CustomerOrderModel();
return View(customerOrderModel);
}
public ActionResult Add(CustomerOrderModel customerOrderModel, FormCollection values)
{
// We write the logic for either the add or update.
return this.View("Index", customerOrderModel);
}
我已从Add操作中删除了代码,因为从断点开始我们知道“//我们为添加或更新编写逻辑”。不是问题。
现在我们遇到麻烦的是这个。我们可以在表格中添加新条目,然后“订单号”字段更新并正确显示。但是,在我们更改客户名称并尝试更新之后,传入“添加”操作的customerOrderModel显示传递的订单号为0(这是我们在系统中的默认值,用于确定我们是否正在执行添加或更新操作)。
所以问题是为什么我们的文本框会更新,这似乎表明我们的模型正在更新,但是当我们尝试提交时,正确的模型不会被传递?此外,为什么在“添加”操作完成后,索引操作不会受到影响?我们需要做些什么来让事情按照我们希望的方式运作?
答案 0 :(得分:4)
<强>模型强>
namespace Demo.Models
{
public class Order
{
public int OrderId { get; set; }
public string CustomerName { get; set; }
}
public class OrderDb:DbContext
{
public DbSet<Order> Orders { get; set; }
}
}
查看
@model Demo.Models.Order
<form action="/" method="post">
<table>
<tr>
<td>@Html.LabelFor(m=>m.OrderId)</td>
<td>
@Html.EditorFor(m => m.OrderId)
</td>
</tr>
<tr>
<td>
@Html.LabelFor(m=>m.CustomerName)
</td>
<td>
@Html.EditorFor(m=>m.CustomerName)
</td>
</tr>
<tr>
<td></td>
<td>
<input type="submit" name="submit" value="submit" />
</td>
</tr>
</table>
</form>
<强>动作强>
public ActionResult Index(Order o)
{
if (o.CustomerName != null)
{
using (OrderDb db = new OrderDb())
{
db.Entry(o).State = o.OrderId == 0 ? EntityState.Added : EntityState.Modified;
db.SaveChanges();
ModelState.Clear();
}
}
return View(o);
}
答案 1 :(得分:0)
这是因为HtmlHelpers首先向ModelState查找值,然后使用您明确使用的值。
因此,当您添加实体时,您会在模型状态中获得[“Id”] = 0。
因此,在成功添加后,您必须使用.Clear()
清除ModelState。