在不知道用户将提供的对象数量的情况下绑定对象列表的输入
Binding input of list of objects without knowing the number of objects the user will feed
我正在尝试将列表项的输入绑定到 List
对象,但似乎唯一可以做到这一点的方法是,如果我用一定数量的那些来初始化我的 List
对象,然后将输入的属性绑定到我的 List
中对象的空属性
因此,例如,除非我将一些 PersonInputModel
对象添加到 PersonInput
,否则以下将给出越界异常
索引视图页面
@page
@model IndexModel
@{
ViewData["Title"] = "Home page";
}
<div class="text-center">
<form method="post">
<label for="name">Name</label>
<input type="text" asp-for="PersonInput[0].Name" />
<label for="age">Age</label>
<input type="number" asp-for="PersonInput[0].Age" />
</form>
</div>
索引页面模型
public class IndexModel : PageModel
{
private readonly ILogger<IndexModel> _logger;
[BindProperty]
public IList<PersonInputModel> PersonInput { get; set; } = new List<PersonInputModel>();
public IndexModel(ILogger<IndexModel> logger)
{
_logger = logger;
}
public void OnGet()
{
}
}
PersonInputModel
public class PersonInputModel
{
public string Name { get; set; }
public int Age { get; set; }
public Person ToPerson()
{
return new Person
{
Name = Name,
Age = Age
};
}
}
但是如果用户可以添加更多的输入表单来添加一个以上的人呢?如果用户提供的输入多于 PersonInput
列表中的对象数怎么办?如何使我的输入列表动态化?
下面是工作demo,大家可以参考一下
Person.cs
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
PersonInputModel
public class PersonInputModel
{
public string Name { get; set; }
public int Age { get; set; }
public List<Person> Persons { get; set; }
}
索引模型
public class IndexModel : PageModel
{
private readonly ILogger<IndexModel> _logger;
[BindProperty]
public PersonInputModel PersonInputModel { get; set; }
public IndexModel(ILogger<IndexModel> logger)
{
_logger = logger;
}
public void OnGet()
{
}
[HttpPost]
public void OnPost(PersonInputModel personInputModel)
{
}
}
Index.cshtml
@page
@model IndexModel
@{
ViewData["Title"] = "Home page";
}
<form method="post">
<label for="name">Name</label>
<input type="text" asp-for="PersonInputModel.Name" />
<label for="age">Age</label>
<input type="number" asp-for="PersonInputModel.Age" />
<button type="button" onclick="myfunction()">Add Person</button>
<table id="myTable" style="display: none;" >
<tr>
<th>Name</th>
<th>age</th>
</tr>
</table>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" >Create</button>
</div>
</div>
</form>
<script type="text/javascript">
var mytab = document.getElementById("myTable");
var i = 0;
function myfunction() {
document.getElementById("myTable").style.display = "block";
document.getElementById("myTable").insertRow(-1).innerHTML =
'<td> <input type="text" name="PersonInputModel.Persons[' +i + '].Name" /> </td><td> <input type="number" name="PersonInputModel.Persons[' + i + '].Age" /> </td>';
i++;
}
</script>
结果:
我正在尝试将列表项的输入绑定到 List
对象,但似乎唯一可以做到这一点的方法是,如果我用一定数量的那些来初始化我的 List
对象,然后将输入的属性绑定到我的 List
因此,例如,除非我将一些 PersonInputModel
对象添加到 PersonInput
索引视图页面
@page
@model IndexModel
@{
ViewData["Title"] = "Home page";
}
<div class="text-center">
<form method="post">
<label for="name">Name</label>
<input type="text" asp-for="PersonInput[0].Name" />
<label for="age">Age</label>
<input type="number" asp-for="PersonInput[0].Age" />
</form>
</div>
索引页面模型
public class IndexModel : PageModel
{
private readonly ILogger<IndexModel> _logger;
[BindProperty]
public IList<PersonInputModel> PersonInput { get; set; } = new List<PersonInputModel>();
public IndexModel(ILogger<IndexModel> logger)
{
_logger = logger;
}
public void OnGet()
{
}
}
PersonInputModel
public class PersonInputModel
{
public string Name { get; set; }
public int Age { get; set; }
public Person ToPerson()
{
return new Person
{
Name = Name,
Age = Age
};
}
}
但是如果用户可以添加更多的输入表单来添加一个以上的人呢?如果用户提供的输入多于 PersonInput
列表中的对象数怎么办?如何使我的输入列表动态化?
下面是工作demo,大家可以参考一下
Person.cs
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
PersonInputModel
public class PersonInputModel
{
public string Name { get; set; }
public int Age { get; set; }
public List<Person> Persons { get; set; }
}
索引模型
public class IndexModel : PageModel
{
private readonly ILogger<IndexModel> _logger;
[BindProperty]
public PersonInputModel PersonInputModel { get; set; }
public IndexModel(ILogger<IndexModel> logger)
{
_logger = logger;
}
public void OnGet()
{
}
[HttpPost]
public void OnPost(PersonInputModel personInputModel)
{
}
}
Index.cshtml
@page
@model IndexModel
@{
ViewData["Title"] = "Home page";
}
<form method="post">
<label for="name">Name</label>
<input type="text" asp-for="PersonInputModel.Name" />
<label for="age">Age</label>
<input type="number" asp-for="PersonInputModel.Age" />
<button type="button" onclick="myfunction()">Add Person</button>
<table id="myTable" style="display: none;" >
<tr>
<th>Name</th>
<th>age</th>
</tr>
</table>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" >Create</button>
</div>
</div>
</form>
<script type="text/javascript">
var mytab = document.getElementById("myTable");
var i = 0;
function myfunction() {
document.getElementById("myTable").style.display = "block";
document.getElementById("myTable").insertRow(-1).innerHTML =
'<td> <input type="text" name="PersonInputModel.Persons[' +i + '].Name" /> </td><td> <input type="number" name="PersonInputModel.Persons[' + i + '].Age" /> </td>';
i++;
}
</script>
结果: