ASP.NET 核心 MVC 模型无法识别值变化
ASP.NET Core MVC model doesn't recognize value changes
我正在尝试制作一个简单的 ASP.NET 核心 MVC 应用程序,它可以更新/插入/显示我们数据库中的数据。
我有这样写的模型(类似于数据库字段):
public class INVOICE : ModelBase
{
[Key]
public decimal ID { get; set; }
public string CONTRACTID { get; set; }
public string ORDERID { get; set; }
public decimal? INVOICEAMOUNT { get; set; }
public string BARCODE { get; set; }
...
}
(具有更多功能,如数据库更新/插入)
我有一个控制器:
public class HomeController : Controller
{
// GET: HomeController
INVOICE invoice = CRUD.GetFirstOrDefault(new INVOICE(), @"WHERE ID IN (75693)");
public ActionResult Index()
{
return View(invoice);
}
[HttpPost]
public bool Update()
{
return invoice.Update();
}
}
和 Index.cshtml
:
<body>
<div class="form-group">
<label>Barcode</label>
<input type="text" class="form-control" id="BARCODE" placeholder="0" value="@Model.BARCODE" readonly>
</div>
<div class="form-group">
<label>Id</label>
<input type="text" class="form-control" id="ID" placeholder="0" value="@Model.ID" readonly>
</div>
<div class="form-group">
<label>INVOICEAMOUNT</label>
<input type="text" class="form-control" name="INVOICEAMOUNT" id="INVOICEAMOUNT" value="@Model.INVOICEAMOUNT" aria-describedby="emailHelp" placeholder="0">
</div>
<form id="formUpdate">
<div>
<asp:button id="Button" class="btn btn-primary">Update</asp:button>
</div>
</form>
@section Scripts{
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script>
$(function () {
$("#Button").click(function () {
$.ajax({
type: "POST",
url: "/Home/Update",
success: function (response) {
console.log(response);
},
failure: function (response) {
alert("Fail");
},
error: function (response) {
alert("error");
}
});
});
});
</script>
}
</body>
但是现在,当我在更改 INVOICEAMOUNT
的 Inputfield 值后单击按钮时,更新被调用并成功,但值与我初始化模型时的值相同.
我如何告诉我的模型值已更改?
编辑:
我的措辞不好。
更新正在运行,但更新未使用视图中显示的值。它仍然使用我初始化的值,即使我更改了输入字段值(点击它,写了一个新数字)。
已更新
您的表单字段(输入)应该在您的 form
元素中。
<form id="formUpdate">
<div class="form-group">
<label>Barcode</label>
<input type="text" class="form-control" id="BARCODE" placeholder="0" value="@Model.BARCODE" readonly>
</div>
<div class="form-group">
<label>Id</label>
<input type="text" class="form-control" id="ID" placeholder="0" value="@Model.ID" readonly>
</div>
<div class="form-group">
<label>INVOICEAMOUNT</label>
<input type="text" class="form-control" name="INVOICEAMOUNT" id="INVOICEAMOUNT" value="@Model.INVOICEAMOUNT" aria-describedby="emailHelp" placeholder="0">
</div>
<div>
<asp:button id="Button" class="btn btn-primary" type="submit">Update</asp:button>
</div>
</form>
你的控制器应该接受你的模型作为参数
[HttpPost]
public bool Update(INVOICE model)
{
invoice.BARCODE = model.BARCODE;
invoice.ORDERID = model.ORDERID
.... .
return invoice.Update();
}
最后删除按钮单击事件,因为我们将按钮类型更改为 submit
,它将自动执行表单 post。无需单击按钮和 ajax 调用。
试试这个
[HttpPost]
public bool Update(INVOICE model)
{
invoice.BARCODE = model.BARCODE;
invoice.ORDERID = model.ORDERID
.... .
return invoice.Update();
}
可以使用 Html.BeginForm()
来实现您想要实现的目标。
按下 更新 按钮后,更新的 INVOICE
模型将 POST
编辑到 Update(INVOICE invoice)
操作。
控制器端:
public class HomeController : Controller
{
public ActionResult Index(INVOICE model = null)
{
if (model == null || model.ID == 0)
{
model = CRUD.GetFirstOrDefault(new INVOICE(), @"WHERE ID IN (75693)");
}
return View(model);
}
[HttpPost]
public ActionResult Update(INVOICE invoice)
{
if (ModelState.IsValid)
{
// TODO: additional logic to save the updated `invoice` record
}
return View("Index", invoice);
}
}
Index
视图:
@model Models.INVOICE
@{
ViewBag.Title = "Index";
}
@using (Html.BeginForm("Update", "Home"))
{
@* @Html.ValidationSummary(); *@
<div class="form-group">
@Html.LabelFor(m => m.BARCODE)
@Html.TextBoxFor(m => m.BARCODE, new { @class = "form-control", placeholder = "0" })
@Html.ValidationMessageFor(m => m.BARCODE)
</div>
<div class="form-group">
@Html.LabelFor(m => m.ID)
@Html.TextBoxFor(m => m.ID, new { @class = "form-control", placeholder = "0" })
@Html.ValidationMessageFor(m => m.ID)
</div>
<div class="form-group">
@Html.LabelFor(m => m.INVOICEAMOUNT)
@Html.TextBoxFor(m => m.INVOICEAMOUNT, new { @class = "form-control", placeholder = "0", aria_describedby="emailHelp" })
@Html.ValidationMessageFor(m => m.INVOICEAMOUNT)
</div>
<button type="submit" class="btn btn-primary">Update</button>
@Html.HiddenFor(m => m.CONTRACTID)
@Html.HiddenFor(m => m.ORDERID)
}
我正在尝试制作一个简单的 ASP.NET 核心 MVC 应用程序,它可以更新/插入/显示我们数据库中的数据。 我有这样写的模型(类似于数据库字段):
public class INVOICE : ModelBase
{
[Key]
public decimal ID { get; set; }
public string CONTRACTID { get; set; }
public string ORDERID { get; set; }
public decimal? INVOICEAMOUNT { get; set; }
public string BARCODE { get; set; }
...
}
(具有更多功能,如数据库更新/插入)
我有一个控制器:
public class HomeController : Controller
{
// GET: HomeController
INVOICE invoice = CRUD.GetFirstOrDefault(new INVOICE(), @"WHERE ID IN (75693)");
public ActionResult Index()
{
return View(invoice);
}
[HttpPost]
public bool Update()
{
return invoice.Update();
}
}
和 Index.cshtml
:
<body>
<div class="form-group">
<label>Barcode</label>
<input type="text" class="form-control" id="BARCODE" placeholder="0" value="@Model.BARCODE" readonly>
</div>
<div class="form-group">
<label>Id</label>
<input type="text" class="form-control" id="ID" placeholder="0" value="@Model.ID" readonly>
</div>
<div class="form-group">
<label>INVOICEAMOUNT</label>
<input type="text" class="form-control" name="INVOICEAMOUNT" id="INVOICEAMOUNT" value="@Model.INVOICEAMOUNT" aria-describedby="emailHelp" placeholder="0">
</div>
<form id="formUpdate">
<div>
<asp:button id="Button" class="btn btn-primary">Update</asp:button>
</div>
</form>
@section Scripts{
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script>
$(function () {
$("#Button").click(function () {
$.ajax({
type: "POST",
url: "/Home/Update",
success: function (response) {
console.log(response);
},
failure: function (response) {
alert("Fail");
},
error: function (response) {
alert("error");
}
});
});
});
</script>
}
</body>
但是现在,当我在更改 INVOICEAMOUNT
的 Inputfield 值后单击按钮时,更新被调用并成功,但值与我初始化模型时的值相同.
我如何告诉我的模型值已更改?
编辑: 我的措辞不好。 更新正在运行,但更新未使用视图中显示的值。它仍然使用我初始化的值,即使我更改了输入字段值(点击它,写了一个新数字)。
已更新
您的表单字段(输入)应该在您的 form
元素中。
<form id="formUpdate">
<div class="form-group">
<label>Barcode</label>
<input type="text" class="form-control" id="BARCODE" placeholder="0" value="@Model.BARCODE" readonly>
</div>
<div class="form-group">
<label>Id</label>
<input type="text" class="form-control" id="ID" placeholder="0" value="@Model.ID" readonly>
</div>
<div class="form-group">
<label>INVOICEAMOUNT</label>
<input type="text" class="form-control" name="INVOICEAMOUNT" id="INVOICEAMOUNT" value="@Model.INVOICEAMOUNT" aria-describedby="emailHelp" placeholder="0">
</div>
<div>
<asp:button id="Button" class="btn btn-primary" type="submit">Update</asp:button>
</div>
</form>
你的控制器应该接受你的模型作为参数
[HttpPost]
public bool Update(INVOICE model)
{
invoice.BARCODE = model.BARCODE;
invoice.ORDERID = model.ORDERID
.... .
return invoice.Update();
}
最后删除按钮单击事件,因为我们将按钮类型更改为 submit
,它将自动执行表单 post。无需单击按钮和 ajax 调用。
试试这个
[HttpPost]
public bool Update(INVOICE model)
{
invoice.BARCODE = model.BARCODE;
invoice.ORDERID = model.ORDERID
.... .
return invoice.Update();
}
可以使用 Html.BeginForm()
来实现您想要实现的目标。
按下 更新 按钮后,更新的 INVOICE
模型将 POST
编辑到 Update(INVOICE invoice)
操作。
控制器端:
public class HomeController : Controller
{
public ActionResult Index(INVOICE model = null)
{
if (model == null || model.ID == 0)
{
model = CRUD.GetFirstOrDefault(new INVOICE(), @"WHERE ID IN (75693)");
}
return View(model);
}
[HttpPost]
public ActionResult Update(INVOICE invoice)
{
if (ModelState.IsValid)
{
// TODO: additional logic to save the updated `invoice` record
}
return View("Index", invoice);
}
}
Index
视图:
@model Models.INVOICE
@{
ViewBag.Title = "Index";
}
@using (Html.BeginForm("Update", "Home"))
{
@* @Html.ValidationSummary(); *@
<div class="form-group">
@Html.LabelFor(m => m.BARCODE)
@Html.TextBoxFor(m => m.BARCODE, new { @class = "form-control", placeholder = "0" })
@Html.ValidationMessageFor(m => m.BARCODE)
</div>
<div class="form-group">
@Html.LabelFor(m => m.ID)
@Html.TextBoxFor(m => m.ID, new { @class = "form-control", placeholder = "0" })
@Html.ValidationMessageFor(m => m.ID)
</div>
<div class="form-group">
@Html.LabelFor(m => m.INVOICEAMOUNT)
@Html.TextBoxFor(m => m.INVOICEAMOUNT, new { @class = "form-control", placeholder = "0", aria_describedby="emailHelp" })
@Html.ValidationMessageFor(m => m.INVOICEAMOUNT)
</div>
<button type="submit" class="btn btn-primary">Update</button>
@Html.HiddenFor(m => m.CONTRACTID)
@Html.HiddenFor(m => m.ORDERID)
}