我正在開發使用ASP.NET核心5 MVC web應用,其中我尋求使多次提交POST從接收的圖型的形式到我的控制器的IEnumerable(從一個稱為模型Result)與我在動態值填充每個表單的輸入。
但是,當我通過控制器從視圖發送這些表單之一時,在控制器中,我只從模型接收一個物件,其中包含所有空值或空值,這告訴我似乎這些資料從未通過表單發送過到我的控制器。
有沒有更好的方法來實作這一點,或者如何將這些值從多個表單傳遞到我的控制器?如果我所做的已經完全錯誤,請提前道歉,我已經學習 ASP.NET Core MVC 幾天了。
考慮因素
我尋求實作的是,用戶可以在同一個視圖中輸入屬于同一個模型的多個值,因為每個表單雖然相同,但都試圖更新同一模型或表中的不同記錄或列,所以當表單的提交被發送到控制器視圖不會改變,只有資料庫中的記錄隨著視圖中的每次提交而更新。如果有更好的方法或正確的方法來做到這一點,我愿意改變邏輯,因為正如我所提到的,我一直很少使用框架。
解釋了問題和我的目標,我將更詳細地解釋提到的流程和代碼:
從
Mechanical我的控制器的方法中,我將一個物件串列回傳到它們對應的視圖中,這些物件是由 a 帶來的DataBaseContext:// CONTROLLER() that passes an enumerable list of Objects to View Mechanical.cshtml public IActionResult Mechanical() { IEnumerable<Result> objList = _db.Results; return View(objList); }在
Mechanical()視圖中,我通過獲取物件的串列和疊代forEach()環,其中對于每一個物件創建引導到稱為相同的控制器方法的形式Update(),其中我獲取物件的值在零和空(即是我的問題):
// VIEW
@model IEnumerable<FatForm.Models.Result>
@if (Model.Count() > 0)
{
@foreach(var result in Model)
{
<form method="post" asp-action="Update">
<input asp-for="@result.Id" hidden />
<input asp-for="@result.Type" hidden />
<input asp-for="@result.FatId" hidden />
<div class="border p-3">
<div class="form-group row">
<h2 class="text-black-50 pl-3">Edit Result</h2>
</div>
<div class="row">
<div class="col-12">
<div class="form-group row">
<div class="col-3">
<label asp-for="@result.Section"></label>
</div>
<div class="col-3">
<label asp-for="@result.Procedure"></label>
</div>
<div class="col-3">
<label asp-for="@result.ResultDescription"></label>
</div>
<div class="col-3">
<label asp-for="@result.Passed"></label>
</div>
</div>
<div class="form-group row">
<div class="col-3">
<input asp-for="@result.Section" class="form-control" />
</div>
<div class="col-3">
<input asp-for="@result.Procedure" class="form-control" />
</div>
<div class="col-3">
<input asp-for="@result.ResultDescription" class="form-control" />
<span asp-validation-for="@result.ResultDescription" class="text-danger"></span>
</div>
<div class="col-3">
<input asp-for="@result.Passed" class="form-control" />
<span asp-validation-for="@result.Passed" class="text-danger"></span>
</div>
</div>
<div class="form-group row">
<div class="col-8 offset-2 row">
<div class="col">
<input type="submit" class="btn btn-info w-75" value="Save" />
</div>
</div>
</div>
</div>
</div>
</div>
</form>
}
}
else
{
<p>No results created yet</p>
}
@section Scripts{
@{
<partial name="_ValidationScriptsPartial" />
}
}
我應該希望將表單值發送到以下
Update()控制器方法,在該方法中我將所有物件值設定為 null:// POST Update [HttpPost] [ValidateAntiForgeryToken] public IActionResult Update(Result obj) { if (ModelState.IsValid) { _db.Results.Update(obj); _db.SaveChanges(); //return RedirectToAction("Index"); } return View(obj); }

正如我在開始時解釋的那樣,我希望可以通過指出我做錯了什么或應該以什么方式做來幫助我。在此先感謝您的幫助。
uj5u.com熱心網友回復:
在這里,您需要在操作方法引數中添加 FromBody 屬性。
public IActionResult Update([FromBody]Result obj)
{
.....
}
uj5u.com熱心網友回復:
模型系結查找名稱模式的來源prefix.property_name。如果什么也沒找到,它會在property_name沒有前綴的情況下查找。在您的代碼中,asp-for標簽助手將生成如下名稱:result.propertyName.It could not match with backend model。您需要使用[Bind(Prefix ="result")]來指定前綴:
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Update([Bind(Prefix ="result")]Result obj)
{
//do your stuff...
}
至于接收IEnumerable引數的作用,首先你需要改變你的剃刀視圖將表單移到 foreach 回圈之外,然后你需要將 asp-for 標簽助手 tattribute 更改為@Model.ToList()[index].PropertyName:
@model IEnumerable<Result>
@if (Model.Count() > 0)
{
<form method="post" asp-action="Update">
@for (int i = 0; i < Model.Count(); i )
{
<input asp-for="@Model.ToList()[i].Id" hidden />
<input asp-for="@Model.ToList()[i].Type" hidden />
<input asp-for="@Model.ToList()[i].FatId" hidden />
<div class="border p-3">
<div class="form-group row">
<h2 class="text-black-50 pl-3">Edit Result</h2>
</div>
<div class="row">
<div class="col-12">
<div class="form-group row">
<div class="col-3">
<label asp-for="@Model.ToList()[i].Section"></label>
</div>
<div class="col-3">
<label asp-for="@Model.ToList()[i].Procedure"></label>
</div>
<div class="col-3">
<label asp-for="@Model.ToList()[i].ResultDescription"></label>
</div>
<div class="col-3">
<label asp-for="@Model.ToList()[i].Passed"></label>
</div>
</div>
<div class="form-group row">
<div class="col-3">
<input asp-for="@Model.ToList()[i].Section" class="form-control" />
</div>
<div class="col-3">
<input asp-for="@Model.ToList()[i].Procedure" class="form-control" />
</div>
<div class="col-3">
<input asp-for="@Model.ToList()[i].ResultDescription" class="form-control" />
<span asp-validation-for="@Model.ToList()[i].ResultDescription" class="text-danger"></span>
</div>
<div class="col-3">
<input asp-for="@Model.ToList()[i].Passed" class="form-control" />
<span asp-validation-for="@Model.ToList()[i].Passed" class="text-danger"></span>
</div>
</div>
</div>
</div>
</div>
}
<div class="form-group row">
<div class="col-8 offset-2 row">
<div class="col">
<input type="submit" class="btn btn-info w-75" value="Save" />
</div>
</div>
</div>
</form>
}
else
{
<p>No results created yet</p>
}
控制器:
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Update(IEnumerable<Result> obj)
{
return View("Mechanical", obj);
}
結果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/399133.html
標籤:C# 视觉工作室 asp.net核心 asp.net-core-mvc
上一篇:系統在for回圈中超出范圍
