gpt4 book ai didi

c# - 提交表单时模型集合丢失

转载 作者:行者123 更新时间:2023-11-30 16:06:42 25 4
gpt4 key购买 nike

使用模型下方的发布请求为两个集合返回 null 但它正确返回 bool 属性。我的期望是在 get 请求期间加载到模型中的集合将持续到 post 请求。我错过了什么?

编辑:本质上,我正在尝试根据用户选择的选择列表和复选框来更新发票列表。

Controller :

    [HttpGet]
[AllowAnonymous]
public async Task<ActionResult> Index(bool displayFalse = true)
{
InvoiceViewModel invoiceView = new InvoiceViewModel();
var companies = new SelectList(await DbContext.Company.ToListAsync(), "CompanyID", "Name").ToList();
var invoices = await DbContext.Invoice.Where(s => s.Paid.Equals(displayFalse)).ToListAsync();

return View(new InvoiceViewModel { Companies = companies,Invoices = invoices, SelectedCompanyID = 0, DisplayPaid = displayFalse});
}

[HttpPost]
[AllowAnonymous]
public async Task<IActionResult> Index(InvoiceViewModel model)
{
model.Invoices = await DbContext.Invoice.Where(s => s.CompanyID.Equals(model.SelectedCompanyID) && s.Paid.Equals(model.DisplayPaid)).ToListAsync();

return View(model);
}

型号:

public class InvoiceViewModel

{

public int SelectedCompanyID { get; set; }

public bool DisplayPaid { get; set; }

public ICollection<SelectListItem> Companies { get; set; }

public ICollection<Invoice> Invoices{ get; set; }

}

查看:

@model InvoiceIT.Models.InvoiceViewModel
<form asp-controller="Billing" asp-action="Index" method="post" class="form-horizontal" role="form">
<label for="companyFilter">Filter Company</label>
<select asp-for="SelectedCompanyID" asp-items="Model.Companies" name="companyFilter" class="form-control"></select>
<div class="checkbox">
<label>
<input type="checkbox" asp-for="DisplayPaid" />Display Paid
<input type="submit" value="Filter" class="btn btn-default" />
</label>
</div>
<br />
</form>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.Invoices.FirstOrDefault().InvoiceID)
</th>
<th>
@Html.DisplayNameFor(model => model.Invoices.FirstOrDefault().CompanyID)
</th>
<th>
@Html.DisplayNameFor(model => model.Invoices.FirstOrDefault().Description)
</th>
<th>
@Html.DisplayNameFor(model => model.Invoices.FirstOrDefault().InvoiceDate)
</th>
<th>
@Html.DisplayNameFor(model => model.Invoices.FirstOrDefault().DueDate)
</th>
<th>
@Html.DisplayNameFor(model => model.Invoices.FirstOrDefault().Paid)
</th>
<th></th>
</tr>

@foreach (var item in Model.Invoices)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.InvoiceID)
</td>
<td>
@Html.DisplayFor(modelItem => item.CompanyID)
</td>
<td>
@Html.DisplayFor(modelItem => item.Description)
</td>
<td>
@Html.DisplayFor(modelItem => item.InvoiceDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.DueDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Paid)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id = item.InvoiceID }) |
@Html.ActionLink("Details", "Index", "InvoiceItem", new { id = item.InvoiceID }) |
@Html.ActionLink("Delete", "Delete", new { id = item.InvoiceID })
</td>
</tr>
}
</table>

最佳答案

表单仅回传其控件(输入、文本区域、选择)的名称/值对。由于您生成的仅有的 2 个控件用于 SelectedCompanyIDDisplayPaid模型的属性,那么只有那些属性会在发布时被绑定(bind)。

根据您的评论,您真正想要做的是根据所选公司和复选框的值更新发票表。

从性能的角度来看,该方法是使用 ajax 仅根据控件的值更新发票表。

创建一个新的 Controller 方法,返回表行的部分 View

public PartialViewResult Invoices(int CompanyID, bool DisplayPaid)
{
// Get the filtered collection
IEnumerable<Invoice> model = DbContext.Invoice.Where(....
return PartialView("_Invoices", model);
}

请注意,如果您希望最初显示未过滤的结果,您可能希望使 CompanyID 参数可为空并调整查询

和局部 View _Invoices.cshtml

@model IEnumerable<yourAssembly.Invoice>
@foreach(var item in Model)
{
<tr>
<td>@Html.DisplayFor(m => item.InvoiceID)</td>
.... other table cells
</tr>
}

在主视图中

@model yourAssembly.InvoiceViewModel
@Html.BeginForm()) // form may not be necessary if you don't have validation attributes
{
@Html.DropDownListFor(m => m.SelectedCompanyID, Model.Companies)
@Html.CheckboxFor(m => m.DisplayPaid)
<button id="filter" type="button">Filter results</button>
}
<table>
<thead>
....
</thead>
<tbody id="invoices">
// If you want to initially display some rows
@Html.Action("Invoices", new { CompanyID = someValue, DisplayPaid = someValue })
</tbody>
</table>

<script>
var url = '@Url.Action("Invoices")';
var table = $('#invoices');
$('#filter').click(function() {
var companyID = $('#SelectedCompanyID').val();
var isDisplayPaid = $('#DisplayPaid').is(':checked');
$.get(url, { CompanyID: companyID, DisplayPaid: isDisplayPaid }, function (html) {
table.append(html);
});
});
</script>

另一种方法是按原样发布表单,而不是返回 View ,而是使用

return RedirectToAction("Invoice", new { companyID = model.SelectedCompanyID, DisplayPaid = model.DisplayPaid });

并修改 GET 方法以接受附加参数。

旁注:您使用 TagHelpers生成

select asp-for="SelectedCompanyID"  asp-items="Model.Companies"  name="companyFilter"  class="form-control"></select>

我对它们还不够熟悉,但如果name="companyFilter"有效(并覆盖默认名称 name="SelectedCompanyID" ),然后生成一个 name属性与您的模型属性不匹配,因此 SelectedCompanyID将是 0 (int 的默认值)在 POST 方法中。

关于c# - 提交表单时模型集合丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31847228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com