ASP.NET 具有 IEnumerable 字段的核心 MVC post 模型
ASP.NET Core MVC post model with IEnumerable field
我正在尝试 post 为多个隐藏字段建模(基本上是为了节省用户输入)。
此视图的模型:
public class LoanModel
{
public LoanCalendarDTO LoanCalendar { get; set; }
public EnterLoanParams LoanParams { get; set; }
}
我尝试 post 返回的型号:
public class EnterLoanParams
{
[Required]
[DataType(DataType.Currency)]
public double TotalLoanAmount { get; set; }
[Required]
[RegularExpression(@"([0-9]{0,2}(,{0,1}([0-9]{0,2})))", ErrorMessage = "Please enter in format as xx,xx")]
public string Rate { get; set; }
[Required]
[RegularExpression(@"([0-9]{0,2})", ErrorMessage = "2 digits ")]
public int YearsToPay { get; set; }
[Required] [DataType(DataType.Date)] public DateTime Start { get; set; }
public List<DecreaseModel> Decreases { get; set; } = new List<DecreaseModel>();
}
而DecreaseModel
是:
public class DecreaseModel
{
[Required]
public string DecreaseType { get; set; }
[Required]
public double Amount { get; set; }
[Required]
public DateTime? Start { get; set; }
public DateTime? End { get; set; }
public Guid ID { get; set; }
public DecreaseModel()
{
ID = Guid.NewGuid();
}
}
在视图中我将它们显示为:
@model Front.Models.LoanModel
@{
ViewBag.Title = "title";
Layout = "_Layout";
}
<form method="post" asp-controller="Home" id="form">
<input class="form-control" name="TotalLoanAmount" type="number" asp-for="LoanParams.TotalLoanAmount" hidden/>
<input class="form-control" name="Rate" type="text" asp-for="LoanParams.Rate" hidden/>
<input class="form-control" name="YearsToPay" type="text" asp-for="LoanParams.YearsToPay" hidden/>
<input class="form-control" name="Start" type="date" asp-for="LoanParams.Start" hidden/>
@for (int index = 0; index < Model.LoanParams.Decreases.Count; index++)
{
@Html.HiddenFor(m => @Model.LoanParams.Decreases[index].Amount)
@Html.HiddenFor(m => @Model.LoanParams.Decreases[index].Start)
@Html.HiddenFor(m => @Model.LoanParams.Decreases[index].End)
@Html.HiddenFor(m => @Model.LoanParams.Decreases[index].DecreaseType)
@Html.HiddenFor(m => @Model.LoanParams.Decreases[index].ID)
}
<button class="btn col-12 btn-success align-content-center btn-lg"
asp-action="Index" asp-controller="Home" type="submit">Return Back</button>
</form>
我可以看到隐藏字段在浏览器调试器中填充了正确的值:
Post 动作:
[HttpPost]
public IActionResult Index(EnterLoanParams loan)
{
return View(loan);
}
但是在 post 我收到空列表:
相关链接:
Assign IENumerable<int> to a hiddenfor
编辑:视图的工作代码:
@for (int index = 0; index < Model.LoanParams.Decreases.Count; index++)
{
<input class="form-control" name="Decreases[@index].Amount" type="number"
asp-for="LoanParams.Decreases[index].Amount" hidden/>
<input class="form-control" name="Decreases[@index].DecreaseType" type="text"
asp-for="LoanParams.Decreases[index].DecreaseType" hidden/>
<input class="form-control" name="Decreases[@index].Start" type="date"
asp-for="LoanParams.Decreases[index].Start" hidden/>
<input class="form-control" name="Decreases[@index].End" type="date"
asp-for="LoanParams.Decreases[index].End" hidden/>
<input class="form-control" name="Decreases[@index].ID"
asp-for="LoanParams.Decreases[index].ID" hidden/>
}
Decreases
的隐藏字段的 name
属性具有 LoanParams.
前缀,这意味着他们将寻求绑定到名称为 [=13 的模型=].
您需要制作 name
Decreases[index].{Prop}
(就像您对其他隐藏字段所做的那样)。
你可以这样做 <input type='hidden' name='Decreases[index].{Prop}' value='your-value'>
我正在尝试 post 为多个隐藏字段建模(基本上是为了节省用户输入)。
此视图的模型:
public class LoanModel
{
public LoanCalendarDTO LoanCalendar { get; set; }
public EnterLoanParams LoanParams { get; set; }
}
我尝试 post 返回的型号:
public class EnterLoanParams
{
[Required]
[DataType(DataType.Currency)]
public double TotalLoanAmount { get; set; }
[Required]
[RegularExpression(@"([0-9]{0,2}(,{0,1}([0-9]{0,2})))", ErrorMessage = "Please enter in format as xx,xx")]
public string Rate { get; set; }
[Required]
[RegularExpression(@"([0-9]{0,2})", ErrorMessage = "2 digits ")]
public int YearsToPay { get; set; }
[Required] [DataType(DataType.Date)] public DateTime Start { get; set; }
public List<DecreaseModel> Decreases { get; set; } = new List<DecreaseModel>();
}
而DecreaseModel
是:
public class DecreaseModel
{
[Required]
public string DecreaseType { get; set; }
[Required]
public double Amount { get; set; }
[Required]
public DateTime? Start { get; set; }
public DateTime? End { get; set; }
public Guid ID { get; set; }
public DecreaseModel()
{
ID = Guid.NewGuid();
}
}
在视图中我将它们显示为:
@model Front.Models.LoanModel
@{
ViewBag.Title = "title";
Layout = "_Layout";
}
<form method="post" asp-controller="Home" id="form">
<input class="form-control" name="TotalLoanAmount" type="number" asp-for="LoanParams.TotalLoanAmount" hidden/>
<input class="form-control" name="Rate" type="text" asp-for="LoanParams.Rate" hidden/>
<input class="form-control" name="YearsToPay" type="text" asp-for="LoanParams.YearsToPay" hidden/>
<input class="form-control" name="Start" type="date" asp-for="LoanParams.Start" hidden/>
@for (int index = 0; index < Model.LoanParams.Decreases.Count; index++)
{
@Html.HiddenFor(m => @Model.LoanParams.Decreases[index].Amount)
@Html.HiddenFor(m => @Model.LoanParams.Decreases[index].Start)
@Html.HiddenFor(m => @Model.LoanParams.Decreases[index].End)
@Html.HiddenFor(m => @Model.LoanParams.Decreases[index].DecreaseType)
@Html.HiddenFor(m => @Model.LoanParams.Decreases[index].ID)
}
<button class="btn col-12 btn-success align-content-center btn-lg"
asp-action="Index" asp-controller="Home" type="submit">Return Back</button>
</form>
我可以看到隐藏字段在浏览器调试器中填充了正确的值:
Post 动作:
[HttpPost]
public IActionResult Index(EnterLoanParams loan)
{
return View(loan);
}
但是在 post 我收到空列表:
相关链接:
Assign IENumerable<int> to a hiddenfor
编辑:视图的工作代码:
@for (int index = 0; index < Model.LoanParams.Decreases.Count; index++)
{
<input class="form-control" name="Decreases[@index].Amount" type="number"
asp-for="LoanParams.Decreases[index].Amount" hidden/>
<input class="form-control" name="Decreases[@index].DecreaseType" type="text"
asp-for="LoanParams.Decreases[index].DecreaseType" hidden/>
<input class="form-control" name="Decreases[@index].Start" type="date"
asp-for="LoanParams.Decreases[index].Start" hidden/>
<input class="form-control" name="Decreases[@index].End" type="date"
asp-for="LoanParams.Decreases[index].End" hidden/>
<input class="form-control" name="Decreases[@index].ID"
asp-for="LoanParams.Decreases[index].ID" hidden/>
}
Decreases
的隐藏字段的 name
属性具有 LoanParams.
前缀,这意味着他们将寻求绑定到名称为 [=13 的模型=].
您需要制作 name
Decreases[index].{Prop}
(就像您对其他隐藏字段所做的那样)。
你可以这样做 <input type='hidden' name='Decreases[index].{Prop}' value='your-value'>