2011-07-07 14 views
4

フォームがあり、状況によっては同じフォームから追加操作と更新操作を切り替える必要があります。以下は、私たちのフォームの縮小バージョンです。ASP.NET MVC 3同じフォームから保存して編集する

enter image description here

効果的に「注文番号」テキストボックスは無効になり、このフォームで編集することはできません。今、このシナリオはちょっとこのようなものです:

  1. 初めてこのフォームにユーザーが着陸すると、「注文番号」テキストボックスは空白になります。
  2. ユーザーが顧客名を入力し、フォームを送信します。
  3. コントローラのこの時点で、データベース内の注文番号の最大値を取得し、注文番号を1つ増やします。我々はそのデータベースに新しいレコードを追加します。
  4. この操作が成功すると、現在のフォームが更新され、[注文番号]テキストボックスが前の手順で作成された注文番号で更新されます。また、現在は編集モードになっています。
  5. ユーザーが「顧客名」を更新してフォームを送信すると、データベースのレコードはに更新されます。この場合、が更新されます。

    ビュー:

    <%: 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); 
        } 
    

    私は追加のアクションからコードを削除している今、いくつかのコードのために

"//追加または更新のロジックを記述します。"問題ではありません。

ここで問題があるのはこれです。テーブルに新しいエントリを追加し、「Order Number」フィールドが更新され、正しく表示されるようにすることができます。しかし、顧客名を変更して更新しようとすると、「追加」アクションに渡されたcustomerOrderModelは、渡される注文番号が0であることを示しています(これはシステムのデフォルトであり、追加または更新操作)。

私たちのテキストボックスは更新されていますが、これは私たちのモデルが更新されていることを示すようですが、提出しようとすると、正しいモデルは渡されません。さらに、「追加」アクションが完了した後にインデックスアクションがヒットしないのはなぜですか?物事を私たちが望むように働かせるためには、どうしなければなりませんか?

答えて

0

これは、HtmlHelpersがまずModelStateで値を探してから、明示的に使用する値を使用するためです。

エンティティを追加すると、モデル状態の["Id"] = 0になります。

正常に追加した後、.Clear()でModelStateをクリアする必要があります。

+0

アクションSA、私はする必要がありますがPraveen Prasadの返信があなたの返答を完了したことになります。ありがとうございました。 – DavidS

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); 
} 
+0

あなたの答えはjfarの答えを補完し、とても役に立ちます。どうもありがとうございました。 – DavidS

関連する問題