2017-10-10 12 views
0

mvc 4の問題に直面しています。データをdbに挿入してモデルをビューに戻しますが、モデルデータは隠しフィールドにバインドされませんIdとVoucher番号のように、他のフィールドには が正しくバインドされますが、問題はIdとVoucherNumであり、IDは主キーであり、VoucherNumはUniqueです。 私はコードとhtmlを述べました。モデルデータは、MVCに挿入した後でtextboxforにバインドされていません

コード:

[HttpPost] 
    public ActionResult Create(Payment payment) 
    { 
     payment.VoucherNum = db.Payments.Count() + 1; 
     Ledger ledger = new Ledger(); 
     ledger.CusId = payment.CustomerId; 
     ledger.Date = payment.Date; 
     ledger.Remarks = payment.Remarks; 
     ledger.Type = payment.Type; 
     string negativeAmount; 
     negativeAmount = "-" + payment.Amount; 
     ledger.Amount = Convert.ToInt32(negativeAmount); 
     ledger.IsActive = true; 
     payment.IsActive = true; 

      db.Payments.Add(payment); 
      db.Ledgers.Add(ledger); 
      db.SaveChanges(); 

     ViewBag.CustomerId = new SelectList(db.Customers.ToList() 
      .Select(x => new { Id = x.Id, CustomerCode = x.Name + "-" + x.CustomerCode } 
      ), "Id", "CustomerCode", payment.CustomerId); 

     var model = db.Payments.Find(payment.Id); 
     return View(model); 
    } 

<h2>Payments</h2> 
 
<hr /> 
 
<div class="row"> 
 
    @using (Html.BeginForm()) 
 
    { 
 
     @Html.AntiForgeryToken() 
 
     @Html.ValidationSummary(true) 
 
     <div class="col-md-4"> 
 
      <div class="form-group"> 
 
       <label class="control-label">Vocher#</label>    
 
       @Html.TextBoxFor(model => model.VoucherNum, new { @class = "form-control", @readonly="true"}) 
 
       @Html.HiddenFor(model=>model.Id) 
 
      </div> 
 
     </div> 
 
     
 
     <div class="col-md-4"> 
 
      <div class="form-group"> 
 
       <label class="control-label">Customer</label> 
 
       @Html.DropDownList("CustomerId", (IEnumerable<SelectListItem>)ViewBag.CusId, "--Select Customer--", new { @class = "form-control" }) 
 
      </div> 
 
     </div>  
 
     <div class="col-md-4"> 
 
      <div class="form-group"> 
 
       <label class="control-label">Date</label> 
 
       @Html.TextBoxFor(model => model.Date, new { @class = "form-control", @id = "date"}) 
 
      </div> 
 
     </div> 
 
     <div class="col-md-4"> 
 
      <div class="form-group"> 
 
       <label class="control-label">Amount</label> 
 
       @Html.TextBoxFor(model => model.Amount, new { @class = "form-control" }) 
 
      </div> 
 
      <div class="form-group"> 
 
       <label class="control-label">Type</label> 
 
       @Html.TextBoxFor(model => model.Type, new { @class = "form-control" }) 
 
      </div> 
 
     </div>  
 
     <div class="col-md-8"> 
 
      <div class="form-group"> 
 
       <label class="control-label">Remarks</label> 
 
       @Html.TextAreaFor(model => model.Remarks, new { @class = "form-control", @rows = "5" }) 
 
      </div> 
 
      <input type="submit" value="Payment Receive" class="btn btn-primary pull-right" /> 
 
     </div>     
 
    } 
 
</div>

Form View after insertion

inspected html of those textfields

答えて

1

ので、ヘルパーメソッドは、入力の値を入力するためにモデル状態辞書を最初に探します。モデル状態辞書には、保存する前に現在VoucherNumのnull値があり、ヘルパーメソッドはこの値を使用して入力フィールドの値を生成します。

は、この問題を解決するには、明示的

db.Payments.Add(payment); 
db.SaveChanges(); 

ModelState.Clear(); 

var p = db.Payments.Find(model.Id); 
return View(p); 

それともがさらに良く、PRGパターンに従う、ビューに戻る前にモデル状態辞書をクリアすることができます。 ポストリダイレクト取得パターンでは、データベースを正常に更新した後、リダイレクト応答がクライアントに返され、クライアントはサーバーに全く新しいGET要求を発行します。

RedirectToActionを使用すると、302応答を返すことができます。

db.SaveChanges(); 
return RedirectToAction("Edit",new {id=payment.Id}); 

これは、リクエストURLの新しいIDを持つEditアクションメソッドに対する新しいGET要求を発行するために、ブラウザを教えてくれます。あなたのGETアクションメソッドはこのIDを使用し、dbからエンティティを取得して返します。

public ActionResult Edit(int id) 
{ 
    var model = db.Payments.Find(id); 
    return View(model); 
} 

PRGパターンを使用することを強くお勧めします。

+0

@Shyjuの他のアクション方法はありません –

関連する問題