模型数据在MVC中插入后不绑定到textboxfor

时间:2017-10-10 20:44:15

标签: asp.net-mvc asp.net-mvc-4 razor

我在mvc 4中遇到问题,我有创建动作方法,我在db中插入数据然后将模型返回到View但模型数据没有绑定到隐藏字段,如Id和凭证号, 在其他领域数据绑定正确,但问题是这些Id和VoucherNum,Id是主键,VoucherNum是唯一的。 我已经提到了代码和HTML。

代码:

[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 个答案:

答案 0 :(得分:1)

因为辅助方法首先会查看模型状态字典以填充输入的值。在保存之前,模型状态字典当前具有VoucherNum的空值,并且辅助方法将使用此值来生成输入字段的值。

要解决此问题,您可以在返回视图之前明确清除模型状态字典

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

这将告诉浏览器使用请求网址中的新ID为Edit操作方法发出新的GET请求。您的GET操作方法将使用此id并从db获取实体并将其返回。

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

我强烈建议您使用PRG模式。