ASP.NET MVC 3从同一表单保存和编辑

时间:2011-07-07 15:24:54

标签: asp.net-mvc

我们有一个表单,根据我们想要在同一表单中的添加操作和更新操作之间切换的情况。以下是我们表格的简化版本。

enter image description here

有效地,“订单号”文本框被禁用,永远不能以此形式进行编辑。现在,情况有点像这样:

  1. 用户首次登录此表单时,“订单号”文本框为空白。
  2. 用户输入客户名称并提交表单。
  3. 此时在控制器操作中,我们获取数据库中订单号的最大值,并将订单号递增1。然后我们在数据库中添加该新记录。
  4. 如果该操作成功,我们将更新当前表单,现在应使用上一步中创建的订单号更新“订单号”文本框,并且还应该发生的是我们现在处于编辑模式。
  5. 假设用户随后更新“客户名称”并提交表单,则此实例中数据库中的记录应更新
  6. 现在有些代码:

    观点:

       <%: 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(这是我们在系统中的默认值,用于确定我们是否正在执行添加或更新操作)。

    所以问题是为什么我们的文本框会更新,这似乎表明我们的模型正在更新,但是当我们尝试提交时,正确的模型不会被传递?此外,为什么在“添加”操作完成后,索引操作不会受到影响?我们需要做些什么来让事情按照我们希望的方式运作?

2 个答案:

答案 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。