簡體   English   中英

當我從具有多個 forms 的視圖提交表單時,為什么在我的 controller 中收到 null 值? 帶 ASP.NET 內核 5 MVC

[英]Why do I receive null values in my controller when I submit a form from a view with multiple forms? With ASP.NET Core 5 MVC

I am developing a web application using ASP.NET Core 5 MVC, in which I seek to make multiple submissions of POST type forms to my controller from a view that receives an IEnumerable (from a model called Result ) with which I am filling in dynamically the values每種形式的輸入。

However, when I send one of those forms from the view through the controller, in the controller I only receive an object from the model with all the null or empty values, which tells me that it seems that this data was never sent through the form到我的 controller。

有沒有更好的方法來實現這一點,或者如何將這些值從多個 forms 傳遞到我的 controller? 如果我所做的已經完全錯誤,請提前道歉,我已經學習 ASP.NET Core MVC 幾天了。

注意事項

我想要實現的是用戶可以在同一個視圖中輸入屬於同一個 model 的多個值,因為每個表單雖然是相同的,但它試圖更新同一個 model 或表中的不同記錄或列,所以當表單的提交被發送到 Controller 視圖不會改變,只有數據庫中的記錄會隨着視圖中的每次提交而更新。 如果有更好的方法或正確的方法可以做到這一點,我願意改變邏輯,因為正如我所提到的,我已經很少使用框架了。

解釋了問題和我的目標,我將更詳細地解釋所提到的流程和代碼:

  1. 從我的 controller 的Mechanical方法中,我將一個對象列表返回到它們對應的視圖,這些視圖由DataBaseContext帶來:

     // CONTROLLER() that passes an enumerable list of Objects to View Mechanical.cshtml public IActionResult Mechanical() { IEnumerable<Result> objList = _db.Results; return View(objList); }
  2. Mechanical()視圖中,我獲取此對象列表並通過forEach()循環對其進行迭代,在該循環中,我為每個 object 創建了一個表單,該表單指向名為Update()的相同 controller 方法,其中我得到了值null 中的 object 和空(這是我的問題):

// 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" />
    }
}
  1. 我應該希望將表單值發送到以下Update() controller 方法,其中我將所有 object 值發送到 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); }

在這里您可以從視圖中看到控制器上的空值

正如我在開頭所解釋的那樣,我希望可以通過指出我做錯了什么或應該以什么方式來幫助我。 在此先感謝您的幫助。

在這里,您需要在您的操作方法參數中添加 FromBody 屬性。

public IActionResult Update([FromBody]Result obj)
{
   .....
}

Model 綁定在源中查找名稱模式prefix.property_name 如果沒有找到,它只查找不帶前綴的property_name 。在您的代碼中, asp-for標簽助手將生成如下名稱: result.propertyName 。它無法與后端 model 匹配。 您需要使用[Bind(Prefix ="result")]來指定前綴:

[HttpPost]
[ValidateAntiForgeryToken]

public IActionResult Update([Bind(Prefix ="result")]Result obj)
{
    //do your stuff...
}

至於接收IEnumerable參數,首先您需要更改您的 razor 視圖以將表單移到 foreach 循環之外,然后您需要將 asp-for 標簽助手屬性更改為@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>
}

Controller:

[HttpPost]
[ValidateAntiForgeryToken]

public IActionResult Update(IEnumerable<Result> obj)
{
    return View("Mechanical", obj);
}

結果:

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM