如何从表单asp.net核心中获取一个模型的元素数组



我需要从表单中获取一个模型的元素数组。然后将相同的数组返回到shape。型号:

public class Check
{
public int Id { get; set; }
public string Text { get; set; }
public int Number1 {get; set;}
public int Number2 {get; set;}
}

控制器:

[HttpGet]
public IActionResult Check(string tema)
{
IEnumerable<Check> less = _context.Checks.Where(e => e.Text == tema);
return View(less);
}
[HttpPost]
public IActionResult Check(IEnumerable<Check> Checks)
{   
return View(Checks);
}

形式:

@model IEnumerable<Check>
@foreach (var check in Model)
{
<form asp-action="Check" asp-controller="Home" method="post">
<p>@check?.Text</p>
<p><input type="text"asp-for="@check.Number1"/></p>
@if(Number1 == Number2)
{<p>ok</p>}

<div class="form-group">
<input type="submit" value="Ok" class="btn btn-default" />
</div>
</form>
}

我让所有的东西都为一个模型工作,如果我传递一个数组,我会得到一个空表单。如何修复它?

1.如果您只想发布单个模型,但后端希望接收IEnumerable<Check>,则需要添加名称属性(name="[0].propertyName"(来覆盖asp-for生成的name="check.propertyName"

2.对于您的代码,它将通过提交按钮生成多个表单。若要发布数组模型,需要将<form>和submit按钮移动到foreach循环之外。

3.如果将阵列模型从视图发布到控制器。IEnumerable<Check> Checks是一个列表模型,因此模型绑定系统将通过[i].propertyName找到名称。

4.<p>元素文本无法通过表单提交传递到后端。如果你想发布它,试着添加一个隐藏的输入。

如果将阵列模型从视图发布到控制器,请更改您的视图,如下所示:

@model IEnumerable<Check>
@{
int i=0;  //add this...
}
<form asp-action="Check" asp-controller="Home" method="post">
@foreach (var check in Model)
{
<p>
@check?.Text                                  
<input type="text"asp-for="@check.Text" name="[@i].Text" hidden/>  @* //add the hidden input*@
</p>  
//add the name...
<p><input type="text"asp-for="@check.Number1" name="[@i].Number1"/></p>
@if(check.Number1 == check.Number2)
{<p>ok</p>}

i++;  //add this...
}
<div class="form-group">
<input type="submit" value="Ok" class="btn btn-default" />
</div>
</form>

如果您发布单个模型,请更改您的视图,如下所示:

@foreach (var check in Model)
{
<form asp-action="Check " asp-controller="Home" method="post">
<p>
@check?.Text                                  
<input type="text"asp-for="@check.Text" name="[0].Text" hidden/>  @* //add the hidden input*@
</p>  
@*add the name...*@
<p><input type="text"asp-for="@check.Number1" name="[0].Number1"/></p>
@if(check.Number1 == check.Number2)
{<p>ok</p>}
<div class="form-group">
<input type="submit" value="Ok" class="btn btn-default" />
</div>
</form>
}

最新更新